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

C# Json使用2个数组反序列化字符串,c#,json,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 Lis

我必须将带有两个列表集合的字符串序列化为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);
 }
公共类产品{
公共字符串名称{get;set;}
};
公共类产品2{
公共字符串年龄{get;set;}
};
私有void Form1\u加载(对象发送方、事件参数e){
List mitems=新列表();
List mitems2=新列表();
添加(新产品{Name=“John”});
添加(新产品2{Age=“28”});
var objects=new{mitems,mitems2};
字符串json=JsonConvert.SerializeObject(对象);
var Items=JsonConvert.DeserializeObject(json);
}

在最后一行中,我遇到了一个异常
无法反序列化当前JSON对象

您无法将对象反序列化到
列表
,因为它不是
列表
它是一个具有两个属性的新匿名类型

改变

 var objects = new { mitems, mitems2 };


要将其添加到产品列表中,您不能将对象反序列化到
列表中,因为它不是
列表
它是一种新的匿名类型,具有两个属性

改变

 var objects = new { mitems, mitems2 };


为了将它添加到产品列表中,而不是添加到匿名对象中,您可能需要创建一个模型来保存它

public class MyModel
{
  public List<Product> products { get; set; }
  public List<Product2> products2 { get; set; }
}
根据您的评论,如果您想迭代产品,那么

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

您可能希望创建一个模型来保存这样的内容,而不是匿名对象

public class MyModel
{
  public List<Product> products { get; set; }
  public List<Product2> products2 { get; set; }
}
根据您的评论,如果您想迭代产品,那么

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

您有几个选项,一个是可以反序列化为
dynamic
,或者可以为最终的json定义根对象

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

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


您有几个选项,一个是可以反序列化为
动态
,或者可以为最终json定义根对象

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

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

您也可以这样做:

using Newtonsoft.Json.Linq;

var item = JsonConvert.DeserializeObject<IDictionary<string, object>>(json)["mitems"];
Console.WriteLine(((JArray)item).ToObject<IList<Product>>());
使用Newtonsoft.Json.Linq;
var item=JsonConvert.DeserializeObject(json)[“mitems”];
Console.WriteLine(((JArray)item.ToObject());
编辑:我重新措辞了我的答案

小提琴手示例:

您也可以这样做:

using Newtonsoft.Json.Linq;

var item = JsonConvert.DeserializeObject<IDictionary<string, object>>(json)["mitems"];
Console.WriteLine(((JArray)item).ToObject<IList<Product>>());
使用Newtonsoft.Json.Linq;
var item=JsonConvert.DeserializeObject(json)[“mitems”];
Console.WriteLine(((JArray)item.ToObject());
编辑:我重新措辞了我的答案




Fiddler示例:

他正在序列化一个数组(与product2混合的product数组)fact@Cid不,这是一个product和product2数组的字典。ouchracer一个匿名类,包含产品和product2的列表。仍然与
列表无关
他正在序列化一个数组(与product2混合的产品数组)fact@Cid不,这是一个product和product2数组的字典。OuchRather是一个匿名类,包含product和product2的列表。仍然与
列表无关
您的示例看起来很简单,但我在System.Core.dllca中获得了抛出的错误+异常:“System.InvalidCastException”可以再次检查吗?找不到JArray\n将Newtonsoft.Json.Linq添加到引用中您的示例看起来很简单,但我获得了抛出的错误+异常:System.Core.dllca中的'System.InvalidCastException'可以再次检查吗?找不到JArray\Addnewtonsoft.Json.Linq到您的引用如果我按照您的示例,在反序列化中我得到的是两个值而不是一个,第一个值为null foreach(Items中的var item){MessageBox.Show(item.Age);}@user6453020第一个项目没有年龄,因为它不是产品2。我只想在每个特定项目中添加每个数组list@user6453020然后使用Rahul的答案并将其序列化以分离列表如果我将遵循您的示例,在反序列化中,我得到的是两个值而不是一个值,第一个值为null foreach(Items中的var item){MessageBox.Show(item.Age);}@user6453020第一个项目不会有一个年龄,因为它不是Product2。我只想在每个特定的数组中添加每个数组list@user6453020然后使用Rahul的答案并序列化它们以分离列表。这个示例没有返回任何东西。我添加了输出。两个示例都正确地反序列化了字符串。您的第一个示例看起来非常简单。但是如何我将项目发送到两个分开的列表中?是否要从反序列化的动态对象中提取mitems和mitems2?我添加了如何将数据提取到两个分开的列表中。此示例没有返回任何内容。我添加了输出。这两个示例都正确地反序列化了字符串。您的第一个示例看起来非常简单。但我如何将项目发送到两个分开的列表中列表?是否要从反序列化的动态对象中提取mitems和mitems2?我添加了如何将数据提取到两个单独的列表中。如何使用foreach(产品中的var项){MessageBox.Show(item.Name);}foreach(Items.products中的var项){MessageBox.Show(item.Name);}@user6453020在答案中查看更新。这对您来说是一个很容易找到的错误表单模型不包含产品的定义。如果我将使用产品更改产品,则我将在forach循环中出错,null例外如何使用foreach(产品中的var项){MessageBox.Show(item.Name);}foreach(Items.Products中的var item){MessageBox.Show(item.Name);}@user6453020请参见答案中的更新。这对您来说是一个很容易找到的错误表单模型不包含产品的定义。如果我将使用产品更改产品,那么我将在forach循环中出错,null异常
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
using Newtonsoft.Json.Linq;

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