泛化JSON序列化类,而不是使用特定的类来表示JSON文件

我有一组JSON文件,结构如下。

{
    "client":
    {
        "Home": { "minVersion": "12","tested": true },"About": { "minVersion": "12","MoreInfo": { "minVersion": "13",},"server":
    {
        "backendVersion": { "minVersion": "1.2" },"DBversion": { "minVersion": "1.2" }
    }
}

我知道反序列化这些是因为它可以使用类来表示JSON文件,这很简单,但是我想做的事情上面有一层复杂性。是否有可能实现这样以获得所需的值而无需专门为每个类创建类。

像使用该JSON的示例一样,我想在“客户端”下获取键的列表,即Home,About和MoreInfo,我还想将minVersion存放在Home,minVersion存放在About,minVersion存放在MoreInfo >

如果有帮助,所有这些特定的JSON文件将具有以下指定的标准结构

{
    "<Client>":
    {
        "<Name>": { "minVersion": "<Version>" },"<server>":
    {
        "<Name>": { "minVersion": "<Version>" }
    }
}

如果有人对如何实现这一点有想法,将不胜感激。

tiancai61 回答:泛化JSON序列化类,而不是使用特定的类来表示JSON文件

如果您不想创建类,则可以使用Newtonsoft.JSON将其反序列化为动态对象并进行查询:

dynamic myObj = JObject.Parse(json);
var minVersion = myObj["client"]["Home"]["minVersion"];

按自己的喜好铸造类型。

如果您想从对象中获取所有Keys并对其进行遍历,则可以执行以下操作:

var client = myObj["client"];
var propertyNames = client.GetType().GetProperties().Select(p => p.Name).ToArray();
foreach(var property in propertyNames) {
    var minVersion = client[property]["minVersion"];
    Console.WriteLine($"Client[{property}] Min Version : {minVersion}");
}
,

如果不想创建具体的类,则可以使用Group-Object来反序列化数据。然后可以从反序列化的对象中检索所需的信息。

$Array |Group-Object -Property email |ForEach-Object {
    [pscustomobject]@{
        first_name = $_.Group[0].first_name
        last_name  = $_.Group[0].last_name
        email      = $_.Group[0].email
        groups     = $_.Group.group_list -join '~' # join all the group names together
    }
} |Export-Csv "C:\temp\DataFromArray.csv" -NoTypeInformation

其中CreateDictionary定义为

AnonymousType

输出

enter image description here

您还可以使用Linq查询Json。例如,

var versionType = new {minVersion=string.Empty,tested=false};
var anonymousType = new { client= CreateDictionary(versionType),server= new Dictionary<string,Version>()};
var result = JsonConvert.DeserializeAnonymousType(json,anonymousType);;
var client = result.client;

输出

enter image description here

本文链接:https://www.f2er.com/2986397.html

大家都在问