使用变量字符串反序列化JSON对象

kokeuurv  于 2023-02-20  发布在  其他
关注(0)|答案(2)|浏览(130)

我尝试使用Newtonsoft.Json在c#中反序列化JSON响应
下面是我使用的JSON响应类型的一个示例:

{
  "version": "1.0",
  "fixes": [
    {
      "fix1": "this is fix 1",
      "fix2": "this is fix 2",
      "fix3": "this is fix 3"
    }
  ]
}

在这个响应中,可以有任意数量的“修复”。
我的对象类如下所示:

public class Update
{
    public class Fix
    {
        public IDictionary<string, string> Values { get; set; }
    }
    
    public class Root
    {
        public string version { get; set; }
        public List<Fix> fixes { get; set; }
    }
}

这里我反序列化http响应并尝试获取修复的值,但所有值都为null:

var root = JsonConvert.DeserializeObject<Update.Root>(strContent);
        
Update.Fix fixes = root.fixes[0];

foreach (var fix in fixes.Values)
{
    string test = fix.Value.ToString();
}
bwitn5fc

bwitn5fc1#

去掉类Fix。在Root中有public List<Dictionary<string, string>> fixes { get; set; }

public class Root
{
    public string version { get; set; }
    public List<Dictionary<string, string>> fixes { get; set; }
}

然后,要遍历所有键和值,可以使用SelectMany()将字典列表投影到键/值对的可枚举对象中:

foreach (var pair in root.fixes.SelectMany(p => p))
{
    Console.WriteLine($"{pair.Key}: {pair.Value}");
}

演示小提琴here

wfveoks0

wfveoks02#

你的修正是一个字典,不是一个集合,但是你可以把它转换成一个集合

List<string> fixes = JObject.Parse(json)["fixes"]
        .SelectMany(jo => ((JObject)jo).Properties()
        .Select(p => (string) p.Value))
        .ToList();
        
        foreach (string fix in fixes)
        {
            Console.WriteLine(fix);
        }

输出

this is fix 1
this is fix 2
this is fix 3

或字典

Dictionary<string, string> fixes = JObject.Parse(json)["fixes"]
    .Select(jo => jo.ToObject<Dictionary<string, string>>())
    .FirstOrDefault();

    foreach (var fix in fixes)
    {
        Console.WriteLine(fix.Key + " : " + fix.Value);
    }

输出

fix1 : this is fix 1
fix2 : this is fix 2
fix3 : this is fix 3

相关问题