我正在使用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'。
答案 0 :(得分:3)
首先,您必须弄清楚您的API返回的内容。
现在您正在尝试解析List
jsonToObj
Arrays
(List<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; }
...
}
答案 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#类,然后使用生成的类尝试反序列化类。
答案 2 :(得分:0)
我模拟了您的问题并进行了以下更改:
将反序列化的方法更改为:
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);
。
List
类的List<>
属性接收的值大于整数,因此必须将其转换为长整数:
recipient
这些更改可以解决您的问题。
答案 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.
确保您解析单个对象还是对象列表。