'Newtonsoft.Json.JsonConvert.DeserializeObject(string)' 有一些无效参数
'Newtonsoft.Json.JsonConvert.DeserializeObject(string)' has some invalid arguments
我有以下 JSON 对象,我一直在尝试将其转换为数据类型,在 C# 中说 MessageData 但我一直收到错误
The best overloaded method match for 'Newtonsoft.Json.JsonConvert.DeserializeObject(string)' has some invalid arguments.
JSON如下:
{
{
"SMSMessageData": {
"Message": "Sent to 1/1 Total Cost: NGN 4.4000",
"Recipients": [
{
"statusCode": 102,
"number": "+2348033776502",
"cost": "NGN 4.4000",
"status": "Success",
"messageId": "ATXid_b96d58d359d2e12ad0b9696cee7630ce"
}
]
}
}
}
MessageResponse如下
public class MessageResponse
{
public List<SMSMessageData> Data { get; set; }
}
public class SMSMessageData
{
public string Message { get; set; }
public List<SMSRecipient> Recipients { get; set; }
}
public class SMSRecipient
{
public int StatusCode { get; set; }
public string PhoneNumber { get; set; }
public string Cost { get; set; }
public string StatusMessage { get; set; }
public string MessageId { get; set; }
}
这就是我尝试反序列化它的方式
var response= JsonConvert.DeserializeObject<MessageResponse>(json)
从评论来看,问题似乎出在额外的封闭花括号中,到目前为止我还没有找到删除的方法。
我无法执行 json.ToString() 并且在不将其转换为字符串的情况下,我无法应用 Trim 或任何其他字符串方法来删除额外的大括号。
我需要有关如何将其成功转换为 MessageResponse 数据的帮助。
我 运行 它在 ASP.Net Core 3.1
谢谢
根据 https://json2csharp.com/,您的 JSON 格式错误,我可以看出您需要删除额外的 2 个大括号。
如果 JSON 来自 API 响应,您可以 trim 在反序列化之前用字符串操作括号,例如
var myJsonResponse = json.ToString().Trim().TrimStart('{').TrimEnd('}');
这是正确的JSON:
{
"SMSMessageData": {
"Message": "Sent to 1/1 Total Cost: NGN 4.4000",
"Recipients": [
{
"statusCode": 102,
"number": "+2348033776502",
"cost": "NGN 4.4000",
"status": "Success",
"messageId": "ATXid_b96d58d359d2e12ad0b9696cee7630ce"
}
]
}
}
表示JSON的对象模型:
public class Recipient {
public int statusCode { get; set; }
public string number { get; set; }
public string cost { get; set; }
public string status { get; set; }
public string messageId { get; set; }
}
public class SMSMessageData {
public string Message { get; set; }
public List<Recipient> Recipients { get; set; }
}
public class Root {
public SMSMessageData SMSMessageData { get; set; }
}
然后调用它:
Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse)
首先,您的模型不正确,应该是:
public class MessageResponse
{
public SMSMessageData SMSMessageData { get; set; } //change this...
}
public class SMSMessageData
{
public string Message { get; set; }
public List<SMSRecipient> Recipients { get; set; }
}
public class SMSRecipient
{
public int StatusCode { get; set; }
public string PhoneNumber { get; set; }
public string Cost { get; set; }
public string StatusMessage { get; set; }
public string MessageId { get; set; }
}
为了方便测试,api我设计如下:
[Route("api/[controller]")]
public class ValuesController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
var data = System.IO.File.ReadAllText("test.json");//in test.json is your json string
return Ok(data);
}
}
调用 api:
[HttpGet]
public async Task Get()
{
HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync("https://localhost:44331/api/values");
response.EnsureSuccessStatusCode();
string json = await response.Content.ReadAsStringAsync();
json = json.Trim().TrimStart('{').TrimEnd('}');
var data = JsonConvert.DeserializeObject<MessageResponse>(json);
}
结果:
我有以下 JSON 对象,我一直在尝试将其转换为数据类型,在 C# 中说 MessageData 但我一直收到错误
The best overloaded method match for 'Newtonsoft.Json.JsonConvert.DeserializeObject(string)' has some invalid arguments.
JSON如下:
{
{
"SMSMessageData": {
"Message": "Sent to 1/1 Total Cost: NGN 4.4000",
"Recipients": [
{
"statusCode": 102,
"number": "+2348033776502",
"cost": "NGN 4.4000",
"status": "Success",
"messageId": "ATXid_b96d58d359d2e12ad0b9696cee7630ce"
}
]
}
}
}
MessageResponse如下
public class MessageResponse
{
public List<SMSMessageData> Data { get; set; }
}
public class SMSMessageData
{
public string Message { get; set; }
public List<SMSRecipient> Recipients { get; set; }
}
public class SMSRecipient
{
public int StatusCode { get; set; }
public string PhoneNumber { get; set; }
public string Cost { get; set; }
public string StatusMessage { get; set; }
public string MessageId { get; set; }
}
这就是我尝试反序列化它的方式
var response= JsonConvert.DeserializeObject<MessageResponse>(json)
从评论来看,问题似乎出在额外的封闭花括号中,到目前为止我还没有找到删除的方法。 我无法执行 json.ToString() 并且在不将其转换为字符串的情况下,我无法应用 Trim 或任何其他字符串方法来删除额外的大括号。
我需要有关如何将其成功转换为 MessageResponse 数据的帮助。
我 运行 它在 ASP.Net Core 3.1
谢谢
根据 https://json2csharp.com/,您的 JSON 格式错误,我可以看出您需要删除额外的 2 个大括号。
如果 JSON 来自 API 响应,您可以 trim 在反序列化之前用字符串操作括号,例如
var myJsonResponse = json.ToString().Trim().TrimStart('{').TrimEnd('}');
这是正确的JSON:
{
"SMSMessageData": {
"Message": "Sent to 1/1 Total Cost: NGN 4.4000",
"Recipients": [
{
"statusCode": 102,
"number": "+2348033776502",
"cost": "NGN 4.4000",
"status": "Success",
"messageId": "ATXid_b96d58d359d2e12ad0b9696cee7630ce"
}
]
}
}
表示JSON的对象模型:
public class Recipient {
public int statusCode { get; set; }
public string number { get; set; }
public string cost { get; set; }
public string status { get; set; }
public string messageId { get; set; }
}
public class SMSMessageData {
public string Message { get; set; }
public List<Recipient> Recipients { get; set; }
}
public class Root {
public SMSMessageData SMSMessageData { get; set; }
}
然后调用它:
Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse)
首先,您的模型不正确,应该是:
public class MessageResponse
{
public SMSMessageData SMSMessageData { get; set; } //change this...
}
public class SMSMessageData
{
public string Message { get; set; }
public List<SMSRecipient> Recipients { get; set; }
}
public class SMSRecipient
{
public int StatusCode { get; set; }
public string PhoneNumber { get; set; }
public string Cost { get; set; }
public string StatusMessage { get; set; }
public string MessageId { get; set; }
}
为了方便测试,api我设计如下:
[Route("api/[controller]")]
public class ValuesController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
var data = System.IO.File.ReadAllText("test.json");//in test.json is your json string
return Ok(data);
}
}
调用 api:
[HttpGet]
public async Task Get()
{
HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync("https://localhost:44331/api/values");
response.EnsureSuccessStatusCode();
string json = await response.Content.ReadAsStringAsync();
json = json.Trim().TrimStart('{').TrimEnd('}');
var data = JsonConvert.DeserializeObject<MessageResponse>(json);
}
结果: