【问题标题】:In C# convert Json string to Json Object在 C# 中将 Json 字符串转换为 Json 对象
【发布时间】:2019-05-10 15:51:16
【问题描述】:

我在本地机器上获得了需要反序列化为类对象 Products 的 Json 文件。我打算使用 Newtonsoft.Json 库,因为它是控制台应用程序。我实现了以下代码,我可以看到 jsonString 但没有做正确的事情 JsonConvert.DeserializeObject(st)???

我的 json 也有带有嵌套记录的产品数组!

json

{
 "products": [
   {
    "id": "1",
    "name": "red apple",
    "pricePerUnit ": "1.53"
   },
   {
     "id": "2",
     "name": "green walnut",
     "pricePerUnit ": "0.25"
   },
   {
     "id": "3",
     "name": "avocado",
     "pricePerUnit ": "0.33"
   }
 ]
}

json转换类

var stream = File.OpenText("C:\\Products.json");
string st = stream.ReadToEnd();
var result = JsonConvert.DeserializeObject<Products>(st);

产品类别

public class ProductEntity
{
    public List<Products> products { get; set; }
}

public class Products
{
    public string id { get; set; }
    public string name { get; set; }
    public string pricePerUnit { get; set; }
}

【问题讨论】:

  • 您尝试反序列化 Products 对象。但是,您的 Json 数据并不代表 Products 对象。 (注意并遵循 Json 数据中的 Json 语法!)它包含一个带有“products”属性的 Json 对象,该属性具有一个 Json 数组,其中包含多个对象,每个对象都与您的 Products 类匹配。 (您已经有另一个与此结构匹配的类:ProductEntity。尝试将您的 Json 数据反序列化为 ProductEntity 对象)

标签: c# json .net-core


【解决方案1】:

你可以改造你的 POCO:

public class ProductEntity
{
    [JsonProperty("products")]
    public List<Product> Products { get; set; }
}

public class Product
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("price")]
    public string PricePerUnit { get; set; }
}

然后反序列化如下:

internal class Solution1
{
    static void Main(string[] args)
    {
        string str = @"
        {
             'products': [
               {
                'id': '1',
                'name': 'red apple',
                'price': '1.53'
               },
               {
                 'id': '2',
                 'name': 'green walnut',
                 'price': '0.25'
               },
               {
                 'id': '3',
                 'name': 'avocado',
                 'price': '0.33'
               }
             ]
          }";

        ProductEntity result = JsonConvert.DeserializeObject<ProductEntity>(str);
    }
}

【讨论】:

    【解决方案2】:

    您的问题是 json 上下文中不存在 pricePerUnit,您需要使用数据注释来指定您希望将价格解释为 pricePerUnit

    public class Products
    {
        public string id { get; set; }
        public string name { get; set; }
        [JsonProperty(PropertyName = "price")]
        public string pricePerUnit { get; set; }
    }
    

    编辑:

    正如 gonzo 发布的那样,您没有正确反序列化,您需要一个 List 或将其反序列化为 ProductEntity。

    1. var result = JsonConvert.DeserializeObject&lt;ProductEntity&gt;(st);
    2. var result = JsonConvert.DeserializeObject&lt;List&lt;Products&gt;&gt;(st);

    它们都是正确的,但是由于您已经拥有 ProductEntity 我建议使用第一个。另一个小事类名应该是单数

    【讨论】:

    • 虽然这确实是一个问题,但这只是一个小问题。 “更大”的问题是 Toxic 试图反序列化一个 Products 对象,但 Json 数据显然与 Products 类声明不匹配...
    • 他的第一个问题是JSON是ProductEntity,而不是Products
    • @elgonzo 是的,我看到了你的评论,这就是我编辑答案的原因
    • var 结果 = JsonConvert.DeserializeObject(st);
    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2019-08-27
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多