Json用2个数组反序列化字符串

时间:2018-12-12 12:57:04

标签: c# json

我必须序列化一个带有两个列表集合的字符串作为JSON字符串。

 public class Product {
   public string  Name {get;set;}
 };

 public class Product2 {
   public string Age { get; set; }
 };

 private void Form1_Load(object sender, EventArgs e) {
   List<Product> mitems = new List<Product>();
   List<Product2> mitems2 = new List<Product2>();
   mitems.Add(new Product { Name = "John" });
   mitems2.Add(new Product2 {Age = "28" } );
   var objects = new { mitems, mitems2 };

   string json = JsonConvert.SerializeObject(objects);
   var Items = JsonConvert.DeserializeObject<List<Product>>(json);
 }

在最后一行,我遇到一个异常Cannot deserialize the current JSON object

4 个答案:

答案 0 :(得分:3)

您可能想创建一个模型来代替像这样的匿名对象

public class MyModel
{
  public List<Product> products { get; set; }
  public List<Product2> products2 { get; set; }
}

Form_Load

MyModel model = new MyModel
{
  Products = mitems,
  Products2 = mitems2,
}

var Items = JsonConvert.DeserializeObject<MyModel>(json);

根据您的评论,如果要遍历“产品”,则

foreach(var data in Item.products)
{
  MessageBox.Show(data.Name);
}

答案 1 :(得分:2)

您不能将对象反序列化到List<Product>,因为它不是List<Product>,它是具有两个属性的新匿名类型

更改

 var objects = new { mitems, mitems2 };

收件人

 var objects = new List<Product>(mitems);
 objects.AddRange(mitems2);

也Product2不是产品

您还需要更改

 public class Product2

收件人

 public class Product2 : Product

以将其添加到产品列表中

答案 2 :(得分:1)

您有几种选择,一种是可以反序列化为dynamic,也可以为最终的json定义根对象。

var Items = JsonConvert.DeserializeObject<dynamic>(json);

并投射到您的对象列表:

List<Product> products = new List<Product>();
List<Product2> products2 = new List<Product2>();

foreach (var item in Items.mitems)
{
    Console.WriteLine(item.Name);
    products.Add(((JObject)item).ToObject<Product>());
}

foreach (var item2 in Items.mitems2)
{
    Console.WriteLine(item2.Age);
    products2.Add(((JObject)item2).ToObject<Product2>());
}

输出:

John
28

class RootObj
{
    public List<Product> mitems { get; set; }
    public List<Product2> mitems2 { get; set; }
}

var Items = JsonConvert.DeserializeObject<RootObj>(json);

foreach (var item in Items.mitems)
{
    Console.WriteLine(item.Name);
}

foreach (var item2 in Items.mitems2)
{
    Console.WriteLine(item2.Age);
}

输出:

John
28

两种反序列化方法的输出:

enter image description here

答案 3 :(得分:0)

您也可以这样做:

using Newtonsoft.Json.Linq;

var item = JsonConvert.DeserializeObject<IDictionary<string, object>>(json)["mitems"];
Console.WriteLine(((JArray)item).ToObject<IList<Product>>());

编辑:我改了我的答案

提琴手的例子:https://dotnetfiddle.net/ItMClb