C# 如何反序列化具有对象数组但不使用方括号的Json字符串

C# 如何反序列化具有对象数组但不使用方括号的Json字符串,c#,json,json.net,C#,Json,Json.net,我正在尝试反序列化一个Json字符串,该字符串包含一个不包含括号的数组 { "id": "983f90j30909j3f", "moreInfo": { "info193802": { ... }, "info920938": { ... }, "info849028": { ... } } } 这个“moreInfo”是一个带有动态键的项目数组,没有方括号表示它是一个数组 我曾尝试使用Newtonsoft.Json反序列化它(通常是(JsonCon

我正在尝试反序列化一个Json字符串,该字符串包含一个不包含括号的数组

{ "id": "983f90j30909j3f",
  "moreInfo": {
      "info193802": { ... },
      "info920938": { ... },
      "info849028": { ... }
  }
}
这个“moreInfo”是一个带有动态键的项目数组,没有方括号表示它是一个数组

我曾尝试使用Newtonsoft.Json反序列化它(通常是(
JsonConvert.DeserializeObject()
),但由于这个Json数组不是真正的数组,它会抛出一个错误。这是我的班级:

public class RootObject
{
    public string Id { get; set; }
    public MoreInfo MoreInfo { get; set; }
}


public class MoreInfo
{   
    public List<Info> InfoList{ get; set; }
}

public class Info
{
    properties...
}
公共类根对象
{
公共字符串Id{get;set;}
public MoreInfo MoreInfo{get;set;}
}
公共类MoreInfo
{   
公共列表信息列表{get;set;}
}
公共类信息
{
属性。。。
}

如何进行反序列化?

更新根对象以使用
IDictionary


Newtonsoft可以正确解析数据。数据代表对象,它们恰好嵌套得相当深。您可以通过以下几种方式完成此任务,例如:

dynamic json = JsonConvert.DeserializeObject(response);
var info = json["moreinfo:info913802:example"].Value;
您的另一个选择是使用VisualStudio,让它创建一个您可以反序列化的对象

  • 编辑
  • 特殊粘贴
  • 作为JSON
  • 产出将是:

    public class Rootobject
    {
        public string id { get; set; }
        public Moreinfo moreInfo { get; set; }
    }
    
    public class Moreinfo
    {
        public Info193802 info193802 { get; set; }
        public Info920938 info920938 { get; set; }
        public Info849028 info849028 { get; set; }
    }
    
    public class Info193802
    {
        public string Example { get; set; }
    }
    
    public class Info920938
    {
        public string Example { get; set; }
    }
    
    public class Info849028
    {
        public string Example { get; set; }
    }
    
    我使用的源JSON是您的,但有一个例外:

    { "id": "983f90j30909j3f",
      "moreInfo": {
          "info193802": { "Example" : "Blah" },
          "info920938": { "Example" : "Blah" },
          "info849028": {"Example" : "Blah" }
      }
    }
    

    对多个键使用
    IDictionary MoreInfo{get;set;}
    。您误解了重要的一点:
    MoreInfo
    不是数组。它是一个对象,就像根对象一样。认为它是一个数组是你遇到麻烦的地方。因为它是一个对象而不是数组,所以你需要将它表示为一个字典而不是一个列表,正如一些答案中所解释的那样。聪明的方法完全忽略了这个解决方案。生成的代码适用于问题中列出的确切JSON,但这不足以说明它只是一个示例吗,一个真实的数据集可能不使用这三个特定的
    infonnnn
    属性名,但可能有任何其他类似的名称,并且它们的数量或多或少?我认为从长远来看,使用这些属性名对类进行硬编码是行不通的。@MichaelGeary这是可能的,但为什么JSON会返回得如此不规则和不一致呢?如果你正在使用一个API,它应该是一致的,我认为OP需要提供更多的信息。“info93739”键只是占位符,但它们每次都会改变,并且在每个“moreInfo”中都有不同数量的键这些
    Infonnnn
    键在我看来非常规则和一致,我可以想象这样的结构在任何情况下。例如,本SO页面右侧的相关问题列表,或包含许多条目的常见问题解答,每个条目底部都有指向其他相关主题的链接。在这两种情况下,您都希望看到这样的随机数字,但每个查询都有一组不同的数字。
    public class Rootobject
    {
        public string id { get; set; }
        public Moreinfo moreInfo { get; set; }
    }
    
    public class Moreinfo
    {
        public Info193802 info193802 { get; set; }
        public Info920938 info920938 { get; set; }
        public Info849028 info849028 { get; set; }
    }
    
    public class Info193802
    {
        public string Example { get; set; }
    }
    
    public class Info920938
    {
        public string Example { get; set; }
    }
    
    public class Info849028
    {
        public string Example { get; set; }
    }
    
    { "id": "983f90j30909j3f",
      "moreInfo": {
          "info193802": { "Example" : "Blah" },
          "info920938": { "Example" : "Blah" },
          "info849028": {"Example" : "Blah" }
      }
    }