【问题标题】:How to convert Json type with array to .net object?如何将带有数组的 Json 类型转换为 .net 对象?
【发布时间】:2017-07-06 03:03:56
【问题描述】:

我有 JSON 字符串: // 覆盖率值是一个数组。

  string jsonData = @"{
""plans"":
[
{
""plan_code"":""UL500"",
    ""plan_name"":""Unlimited 500M"",
    ""days"":1,
    ""limit"":500,
    ""coverage"":
[
{
""country"":""SE"",
},
{
""country"":""BZ""
}
]
},
{
""plan_code"":""UL1GB"",
    ""plan_name"":""Unlimited 1GB"",
    ""days"":1,
    ""limit"":1024,
    ""coverage"":
[
{
""country"":""SG"",
},
{
""country"":""JP""
}
]
}
]
}
";

我被 JsonConvert.DeserializeObject 解析为下面的示例代码:

 try
    {
        var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
        HttpResponseMessage response = await client.PostAsync("", content);
        var result = await response.Content.ReadAsStringAsync();
        var tempRecords = JsonConvert.DeserializeObject<List<plan>>(result);
    }

然后我收到一条错误消息: “无法将当前 JSON 对象(例如 {\"name\":\"value\"})反序列化为类型 'System.Collections.Generic.List`1[DAL.plan]',因为该类型需要 JSON 数组(例如[1,2,3]) 以正确反序列化。\r\n要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET可以从 JSON 对象反序列化的类型(例如,不是像整数这样的原始类型,不是像数组或列表这样的集合类型)。也可以将 JsonObjectAttribute 添加到该类型以强制它从 JSON 对象反序列化。\r\ nPath 'plans',第 1 行,第 9 位。”

请告诉我解决这个问题的正确方法。

【问题讨论】:

标签: c# arrays json deserialization


【解决方案1】:

这是来自我的控制台应用程序的具有相同 JSON 的工作代码:

public class Program
{
    static void Main(string[] args)
    {
        string jsonData = "{\"plans\":[{\"plan_code\":\"UL500\",\"plan_name\":\"Unlimited 500M\",\"days\":1,\"limit\":500,\"coverage\":[{\"country\":\"SE\"},{\"country\":\"BZ\"}]},{\"plan_code\":\"UL1GB\",\"plan_name\":\"Unlimited 1GB\",\"days\":1,\"limit\":1024,\"coverage\":[{\"country\":\"SG\"},{\"country\":\"JP\"}]}]}";

        var tempRecords = JsonConvert.DeserializeObject<RootObject>(jsonData);

    }
}

public class RootObject
{
    public List<plan> plans { get; set; }
}

public class plan
{
    public string plan_code { get; set; }
    public string plan_name { get; set; }
    public int days { get; set; }
    public int limit { get; set; }
    public IList<Country> coverage { get; set; }
}

public class Country
{
    public string country { get; set; }
}

我创建了适合您的 JSON 结构的 C# 类。 请注意,我已经修改了您提供的 JSON,因为它的格式似乎不正确。

【讨论】:

  • 非常感谢! string jsonData 在我的情况下实际上是动态数据,你给我的示例代码运行良好
  • @MaiTrọngThànhSEOMaster 如果这有助于解决您的问题,请标记为答案。
【解决方案2】:

整个字符串表示一个对象,该对象具有一个名为“plans”的属性,该属性引用您的数组。字符串本身不是数组,因此如果您尝试将其反序列化为List&lt;T&gt;,那是行不通的。您需要处理您想要的数组被 JSON 对象包装的事实。

This is a similar problem that I think explains it well.

【讨论】:

    【解决方案3】:

    JSON格式对应的实体不匹配。您的格式是一个对象,并且该对象具有属性数组,而不是 List

    【讨论】:

      【解决方案4】:

      你好,刚刚看了你的问题,发现你提供的是json字符串,不是标准格式的json字符串。这里我给我一个很好的json字符串,你可以试试看。

      {
          "plans": [`enter code here`
              {
                  "plan_code": "UL500",
                  "plan_name": "Unlimited500M",
                  "days": 1,
                  "limit": 500,
                  "coverage": [
                      {
                          "country": "SE"
                      },
                      {
                          "country": "BZ"
                      }
                  ]
              },
              {
                  "plan_code": "UL1GB",
                  "plan_name": "Unlimited1GB",
                  "days": 1,
                  "limit": 1024,
                  "coverage": [
                      {
                          "country": "SG"
                      },
                      {
                          "country": "JP"
                      }
                  ]
              }
          ]
      }
      

      【讨论】:

      • 感谢您的指导!
      猜你喜欢
      • 2019-08-15
      • 2023-02-15
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 2023-03-15
      • 2022-01-04
      • 1970-01-01
      • 2016-02-15
      相关资源
      最近更新 更多