'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);
}

结果: