【问题标题】:Deserializing JSON List反序列化 JSON 列表
【发布时间】:2016-05-30 21:22:40
【问题描述】:

我正在尝试使用 JsonConvert 反序列化一些 Json。我要处理的 JSON 示例是:

 2  {
 3    'Name': 'Product 1',
 4    'ExpiryDate': '2000-12-29T00:00Z',
 5    'Price': 99.95,
 6    'Sizes':{ 'Tall': 30
                'ExtraTall':40
              }
 7  },
 8  {
 9    'Name': 'Product 2',
10    'ExpiryDate': '2009-07-31T00:00Z',
11    'Price': 12.50,
12    'Sizes': null
13  }

我已经尝试过一些类似的东西:

var handlerLocal= JsonConvert.DeserializeObject <Dictionary <string,Dictionary<string,string>>>(z);

到目前为止,我只使用这个来处理简单的列表:

var handlerLocal = JsonConvert.DeserializeObject<FriendsHandler>(z);

FriendHandler 像模型一样工作。但在这个新案例中,我在 List 中有一个 List,这让我很生气。

有人可以帮助我吗? 最好的问候

【问题讨论】:

    标签: c# arrays json list


    【解决方案1】:

    通常使用JSON.net,您可以编写一个与您正确解析的对象相匹配的对象,然后照常使用 DeserializeObject。

    在这种情况下,您提供的 JSON 无效。如果它看起来像这样,那将是一本字典:

    {'thing1': {
        'Name': 'Product 1',
        'ExpiryDate': '2000-12-29T00:00Z',
        'Price': 99.95,
        'Sizes':{ 'Tall': 30
                    'ExtraTall':40
                  }
      },
      'thing2': {
        'Name': 'Product 2',
        'ExpiryDate': '2009-07-31T00:00Z',
        'Price': 12.50,
        'Sizes': null
      }}
    

    我觉得应该是一个数组,也就是说应该被[]包围。

    要解析这个,只需这样做:

    var handlerLocal = JArray.Parse(z).ToObject<List<FriendsHandler>>();
    

    【讨论】:

      【解决方案2】:

      在尝试反序列化 JSON 时,我发现最好使用 Json2Sharp.com 创建包含数据的类,但是您提供的 JSON 无效,因此无法从中创建类。

      如果你能找到一些有效的 JSON 来使用,这个工具会为你处理剩下的事情。

      【讨论】:

      • 或在 VS 2013 或更高版本中“将 JSON 粘贴为类”。
      • 真的吗?我在VS2015上,我什至从未听说过这个功能。我想我没有花很多时间研究这些工具。感谢您对此的提醒。
      • Edit-&gt;Paste Special-&gt;Paste JSON as Classes
      • 这是黄金。非常感谢。
      【解决方案3】:

      创建一个这样的模型:

      public class Product
      {
          public string Name { get; set; }
          public DateTime ExpiryDate { get; set; }
          public decimal Price { get; set; }
          public Dictionary<string, int> Sizes { get; set; }
      }
      

      获取您的 JSON

      var productsJson = << Call some repo that returns json string >>
      

      然后调用

      var products = JsonConvert.DeserializeObject<List<Product>>(productsJson);
      

      注意:您需要先使 JSON 有效,目前语法不正确

      ******编辑************

      问题需要更新(见 cmets),你的模型应该是这样的

      public class Self
      {
          public string DeviceID { get; set; }
          public string TimeStamp { get; set; }
      }
      
      public class Location
      {
          public string RoomID { get; set; }
          public string Room { get; set; }
      }
      
      public class Friend
      {
          public string IdUser { get; set; }
          public string Name { get; set; }
          public Location Location { get; set; }
      }
      
      public class RootObject
      {
          public Self Self { get; set; }
          public List<Friend> Friends { get; set; }
      }
      

      然后

      var products = JsonConvert.DeserializeObject<RootObject>(productsJson);
      

      【讨论】:

      • 感谢 Rob 的回答。对 JSON 感到抱歉,因为我从另一个地方复制了它,并且只是根据我的个人问题进行了编辑。问题是我已经有了模型,我认为它是正确的,但响应是 { "self": { "deviceID": "8", "timeStamp": "Feb 18, 2016 16:01:47", }, “朋友”:[{“idUser”:“4”,“姓名”:“约翰”,“位置”:{“房间ID”:“562”,“房间”:“B3.39A”,}}]}我在响应中有和数组。
      • 您能否用实际的 JSON 和您拥有的实际模型更新问题?否则无法提供帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      相关资源
      最近更新 更多