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

时间:2017-12-14 00:23:32

标签: c# json json.net

我试图反序列化一个没有包含括号的数组的Json字符串。

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

这" moreInfo"是一个带动态键的项目数组,没有方括号表示它是一个数组。

我试图通常使用Newtonsoft.Json(JsonConvert.DeserializeObject<rootObject>())反序列化它,但由于这个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...
}

如何对此进行反序列化?

2 个答案:

答案 0 :(得分:1)

更新根对象以使用IDictionary<string, Info>

public class RootObject {
    public string Id { get; set; }
    public IDictionary<string, Info> MoreInfo { get; set; }
}

动态键将是词典中的键。

解析后,您可以通过字典的键访问信息

Info info = rootObject.MoreInfo["info193802"];

答案 1 :(得分:0)

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

dynamic json = JsonConvert.DeserializeObject(response);
var info = json["moreinfo:info913802:example"].Value;

您的另一个选择是使用Visual Studio,让它创建一个可以反序列化的对象。

  1. 修改
  2. 选择性粘贴
  3. 作为JSON
  4. 输出将是:

    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" }
      }
    }