将JSON转换为Object失败 - 无法将当前JSON对象反序列化为System.Collections.Generic.List

时间:2018-04-05 19:28:55

标签: c# json json.net

我正在使用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类型(例如,不是整数的基本类型,不是集合   类似于数组或List的类型,可以从JSON反序列化   宾语。 JsonObjectAttribute也可以添加到类型中以强制它   从JSON对象反序列化。路径'警告',第1行,位置   12'。

4 个答案:

答案 0 :(得分:3)

首先,您必须弄清楚您的API返回的内容。

现在您正在尝试解析List jsonToObj ArraysList<jsonToObj[]>)。您必须决定是使用您的API现在提供的jsonToObj[]List<jsonToObj>还是简单的jsonToObj

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

但是这会引发:

  

对于Int32,JSON整数918819437284太大或太小。路径'消息[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; }
  ...
}

Deserialized JSON

答案 1 :(得分:0)

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

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#类,然后使用生成的类尝试反序列化类。

enter image description here

阅读:Visual Studio Generate Class From JSON or XML

答案 2 :(得分:0)

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

  1. 将反序列化的方法更改为:

    auto [iter, ok] = the_map.emplace(the_key, a_value);
    if (ok) {
      // element was not in map so got inserted
    }
    

    您收到的JSON结果不是a_value,因此无法反序列化为var a = JsonConvert.DeserializeObject<jsonToObj>(richTextBox1.Text);

  2. List类的List<>属性接收的值大于整数,因此必须将其转换为长整数:

    recipient
  3. 这些更改可以解决您的问题。

答案 3 :(得分:0)

看起来这是一个非常古老的帖子,仍然想回答。

首先,您的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.

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