嵌套的Json反序列化(C#)

4
我有一个这样的JSON字符串;
[
  {
    "ID": 123456789,
    "userInf": {
      "Name": "NameSurname1",
      "Adress": "example adress"
    },
    "price": "3898.30",
    "kdv": "701.69",
    "total": "4599,99",
    "note": "example note"
  },
  {
    "ID": 98756431,
    "userInf": {
      "Name": "NameSurname2",
      "Adress": "example address2"
    },
    "price": "1116.10",
    "kdv": "82.90",
    "total": "1199.00",
    "note": "example note2"
  }
]

然后按照以下方式建立类;

public partial class Sale
{
    public long ID { get; set; }
    public UserInf UserInf { get; set; }
    public string Price { get; set; }
    public string Kdv { get; set; }
    public string Total { get; set; }
    public string note { get; set; }
}

public partial class UserInf
{
    public string Name { get; set; }
    public string Adress { get; set; }
}

我使用以下代码调用json并进行反序列化:

var data = JsonConvert.DeserializeObject<Sale>(jsonstring);
var shapedData = Enumerable.Range(0, 1).Select(x =>
                    new
                    {
                        ID = data.ID,
                        userInf = data.UserInf.Name,
                        price = data.Price,
                        kdv = data.Kdv,
                        total = data.Total,
                        note= data.Note
                    }).ToList();

DataTable dt = ToDataTable(shapedData);
dataGridView1.DataSource = dt;

我遇到了错误。但是如果我更改我的JSON并且只保留前半部分,删除“[ ]”符号,代码就可以完美地运行。我需要反序列化多个类似上面的内容,并尝试过多种反序列化方法,但这是目前我得到的最接近的方法。
我在以下这一行代码中遇到了错误:
var data = JsonConvert.DeserializeObject<Sale>(jsonstring);

错误是

无法将当前的JSON数组 (如[1,2,3]) 反序列化为类型..等等。

我知道我错过了一些非常基础的东西,但我没有编程朋友可以问。如果您能提出更好的解决方法,我将不胜感激。


3
错误很明显,您想将对象数组反序列化为单个对象。使用ICollection<Sale>等集合进行反序列化,或确保JSON不包含数组。 - Sir Rufo
1
顺便提一句,你有一个程序员朋友:在谷歌上搜索 json.net 无法反序列化当前的 JSON 数组 - Sir Rufo
2个回答

4

您应该将其反序列化为集合;

JsonConvert.DeserializeObject<List<Sale>>(jsonstring);

你的linq查询看起来像这样;
var shapedData = data.Select(x =>
    new
    {
       ID = x.ID,
       userInf = x.UserInf.Name,
       price = x.Price,
       kdv = x.Kdv,
       total = x.Total,
       note = x.note
    }).ToList();

是的,我认为它会起作用,但我该如何使用 ID = data.ID, userInf = data.UserInf.Name, - Tolgahan ARI

1

你可以尝试这样做,不要使用变量,因为你已经知道返回类型。

List<Sale> data = JsonConvert.DeserializeObject<List<Sale>>(jsonstring);

作为你的字符串返回数据数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接