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

Dur*_*dha -1 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"
}
Run Code Online (Sandbox Code Playgroud)

我试图解析 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; }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下消息的异常:

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。

jAC*_*jAC 6

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

现在你要解析ListjsonToObj ArraysList<jsonToObj[]>)。您必须决定是使用您的 API 现在提供的ajsonToObj[]还是List<jsonToObj>simple jsonToObj

var a = JsonConvert.DeserializeObject<jsonToObj>(richTextBox1.Text);
Run Code Online (Sandbox Code Playgroud)

但这会抛出:

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

因此,请确保Long为此使用 a 。

public class messages
{
    public string id { get; set; }
    public long recipient { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

此外,如果您需要信息,您可以添加inDND到您的jsonToObj课程中:

public class jsonToObj
{
  ...
  public string[] inDND { get; set; }
  ...
}
Run Code Online (Sandbox Code Playgroud)

反序列化 JSON