【问题标题】:Converting JSON to Object fails - Cannot deserialize the current JSON object into System.Collections.Generic.List将 JSON 转换为对象失败 - 无法将当前 JSON 对象反序列化为 System.Collections.Generic.List
【发布时间】:2020-12-11 02:20:27
【问题描述】:

我正在使用 www.textlocal.in 的 API,它返回一个 JSON 格式的对象。

JSON

{  
   "warnings":[  
      {  
         "message":"Number is in DND",
         "numbers":"917000000000"
      }
   ],
   "balance":900,
   "batch_id":311110011,
   "cost":1,
   "num_messages":1,
   "message":{  
      "num_parts":1,
      "sender":"TXTLCL",
      "content":"Test1"
   },
   "receipt_url":"",
   "custom":"",
   "inDND":[  
      "917000000000"
   ],
   "messages":[  
      {  
         "id":"1350123781",
         "recipient":918819437284
      }
   ],
   "status":"success"
}

我试图用来解析 JSON 的代码:

private void button1_Click(object sender, EventArgs e)
{
    var a = JsonConvert.DeserializeObject<List<jsonToObj[]>>(richTextBox1.Text);
}

public class jsonToObj
{
    public warnings[] warnings { get; set; }

    public int balance { get; set; }
    public int batch_id { get; set; }
    public int cost { get; set; }
    public int num_messages { get; set; }
    public message message { get; set; }
    public string receipt_url { get; set; }
    public string custom { get; set; }
    public messages[] messages { get; set; }
    public string status { get; set; }
}


public class warnings
{
    public string message { get; set; }
    public string numbers { get; set; }
}

public class messages
{
    public string id { get; set; }
    public int recipient { get; set; }
}

public class message
{
    public int num_part { get; set; }
    public string sender { get; set; }
    public string content { get; set; }
}

我收到以下消息的异常:

Newtonsoft.Json.JsonSerializationException: '无法反序列化 当前 JSON 对象(例如 {"name":"value"})转换为类型 'System.Collections.Generic.List`1[WindowsFormsApp1.Form2+jsonToObj[]]' 因为该类型需要一个 JSON 数组(例如 [1,2,3])来反序列化 正确。要修复此错误,请将 JSON 更改为 JSON 数组 (例如 [1,2,3])或更改反序列化类型,使其成为正常的 .NET 类型(例如,不是像整数这样的原始类型,也不是集合 可以从 JSON 反序列化的数组或列表等类型 目的。 JsonObjectAttribute 也可以添加到类型中来强制它 从 JSON 对象反序列化。路径“警告”,第 1 行,位置 12.'

【问题讨论】:

  • 根据您提供的 JSON,您只需要 JsonConvert.DeserializeObject&lt;List&lt;jsonToObj[]&gt;&gt;(richTextBox1.Text); 成为 JsonConvert.DeserializeObject&lt;jsonToObj&gt;(richTextBox1.Text);

标签: c# json json.net


【解决方案1】:

首先你必须弄清楚你的 API 返回什么。

现在您正在尝试解析 ListjsonToObj Arrays (List&lt;jsonToObj[]&gt;)。您必须决定是使用 API 现在提供的 jsonToObj[] 还是 List&lt;jsonToObj&gt; 还是简单的 jsonToObj

var a = JsonConvert.DeserializeObject<jsonToObj>(richTextBox1.Text);

但这会抛出:

JSON 整数 918819437284 对于 Int32 来说太大或太小。路径 'messages[0].recipient',第 25 行,第 33 位。”

因此,请确保为此使用 Long

public class messages
{
    public string id { get; set; }
    public long recipient { get; set; }
}

此外,如果您需要信息,可以inDND 添加到您的jsonToObj 班级:

public class jsonToObj
{
  ...
  public string[] inDND { get; set; }
  ...
}

【讨论】:

    【解决方案2】:

    基于字符串,你的类结构应该是这样的:

    public class Warning
    {
        public string message { get; set; }
        public string numbers { get; set; }
    }
    
    public class Message
    {
        public int num_parts { get; set; }
        public string sender { get; set; }
        public string content { get; set; }
    }
    
    public class Message2
    {
        public string id { get; set; }
        public long recipient { get; set; }
    }
    
    public class RootObject
    {
        public List<Warning> warnings { get; set; }
        public int balance { get; set; }
        public int batch_id { get; set; }
        public int cost { get; set; }
        public int num_messages { get; set; }
        public Message message { get; set; }
        public string receipt_url { get; set; }
        public string custom { get; set; }
        public List<string> inDND { get; set; }
        public List<Message2> messages { get; set; }
        public string status { get; set; }
    }
    

    看起来你的类结构不正确,使用 Visual Studio 并从 json 字符串生成 C# 类,然后使用生成的类尝试反序列化类。

    阅读:Visual Studio Generate Class From JSON or XML

    【讨论】:

    • @DurgeshPadha - 将您的数组更改为 list ,根据您的字符串生成的类有 list 而不是数组
    • @DurgeshPadha - 尝试给定的类结构,它必须有效
    【解决方案3】:

    我模拟了您的问题并进行了以下有效的更改:

    1. 将反序列化的方法改成这样:

      var a = JsonConvert.DeserializeObject<jsonToObj>(richTextBox1.Text);
      

      你收到的JSON结果不是List,所以反序列化为List&lt;&gt;是行不通的。

    2. messages 类的recipient 属性接收大于整数的值,因此必须将其转换为长整数,如下所示:

      public long recipient { get; set; }
      

    这些更改解决了您的问题。

    【讨论】:

      【解决方案4】:

      看来这是一篇很老的帖子了,还是想回答一下。

      首先,您的 Json 数据是单数的,这意味着,要么

      var a = JsonConvert.DeserializeObject<List<jsonToObj[]>>(richTextBox1.Text);
      

      var a = JsonConvert.DeserializeObject<List<jsonToObj>>(richTextBox1.Text);
      

      可能不适合你。

      你可以试试:

      var a = JsonConvert.DeserializeObject<jsonToObj>(richTextBox1.Text);
      

      enclose the data with [ and ], which would do the trick.
      

      确保您解析单个对象与对象列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2014-02-16
        相关资源
        最近更新 更多