我必须序列化一个带有两个列表集合的字符串作为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
答案 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
两种反序列化方法的输出:
答案 3 :(得分:0)
您也可以这样做:
using Newtonsoft.Json.Linq;
var item = JsonConvert.DeserializeObject<IDictionary<string, object>>(json)["mitems"];
Console.WriteLine(((JArray)item).ToObject<IList<Product>>());
编辑:我改了我的答案