【问题标题】:Converting json to class object将 json 转换为类对象
【发布时间】:2020-12-02 11:40:29
【问题描述】:

我的对象定义为:

public class sendSmsResult
{
    public sendSmsResult()
    {
        MessageIdList=new List<MessageId>();
    }
    
    public string ErrorCode { get; set; }
    public string PacketId { get; set; }
    public List<MessageId> MessageIdList { get; set; }

}

public class MessageId
{
    public MessageId()
    {
        messageid=new List<string>();
    }
    public List<string> messageid { get; set; }
}

执行后:

IRestResponse response = client.Execute(request);

我从“response.Content”中获取 jsonresult 为

 "{\"sendSmsResult\":{\"ErrorCode\":\"0\",\"PacketId\":\"261633886\",\"MessageIdList\":{\"MessageId\":[\"7096779206\",\"-19\"]}}}"

得到 json 字符串后,我正在运行:

 JsonConvert.DeserializeObject<sendSmsResult>(response.Content);

给出一个错误说:

{"Message":"发生错误。","ExceptionMessage":"错误 转换价值 "{"sendSmsResult":{"ErrorCode":"0","PacketId":"261638899","MessageIdList":{"MessageId":["7097068828","-19"]}}}" 键入“UME.WebApi.Models.sendSmsResult”。路径'',第 1 行,位置

【问题讨论】:

  • 在 JSON 内容中,MessageIdList 不是数组,而是对象。在课堂sendSmsResult,试试public MessageId MessageIdList { get; set; }
  • 您发布的不是异常,它是一个包含序列化异常的 JSON 字符串,这使得它非常难以阅读
  • 无论如何,该 JSON 字符串不包含 sendSmsResult 对象,它包含另一个对象,其 sendSmsResult 属性似乎与您的 sendSmsResult 类匹配
  • @Vernou 那是我做错的一件事,非常感谢。但还是不行。
  • @PanagiotisKanavos 我更新了我的模型,如下 500InternalServerError 的建议,但仍然出现错误。

标签: c# json .net json-deserialization


【解决方案1】:

您需要 sendSmsResult 的包装器,如下所示:

class sendSmsResultWrapper {
public sendSmsResult sendSmsResult {get;set;}
}

而且,sendSmsResult.MessageIdList 的类型是 MessageId,而不是 List&lt;MessageId&gt;!!

【讨论】:

  • 非常感谢您的回复,您的建议与以下建议相同。我试过了,但无法从 System.String 转换或转换为 UME.WebApi.Models.Root。在您的情况下,这将是“无法从 System.String 转换或转换为 UME.WebApi.Models.sendSmsResultWrapper”。
  • 我在here 中尝试过。没有抛出异常,你能错误重现吗?
  • 这太奇怪了。我正在做你正在做的事情,但我得到“无法从 System.String 转换或转换为 UME.WebApi.Models.sendSmsResultWrapper。”错误。
  • 我认为您需要重新检查 response.Content,您确定像您发布的 json 文本一样吗?如果 response.Content 为 "\"some string\""....,您的异常消息将抛出
  • 在下面阅读您的评论,我很确定这是 json 中的一种 json。检查这个example!!
【解决方案2】:

对于它的价值json2csharp.com(无从属关系)为您的示例数据建议以下类结构:

// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
    public class MessageIdList    {
        public List<string> MessageId { get; set; } 
    }

    public class SendSmsResult    {
        public string ErrorCode { get; set; } 
        public string PacketId { get; set; } 
        public MessageIdList MessageIdList { get; set; } 
    }

    public class Root    {
        public SendSmsResult sendSmsResult { get; set; } 
    }

【讨论】:

  • 我收到一条错误消息:无法从 System.String 转换或转换为 UME.WebApi.Models.Root。内部异常说:错误转换值 "{"sendSmsResult":{"ErrorCode":"0","PacketId":"261661100","MessageIdList":{"MessageId":["7097954236","-19"]} }}”来输入“UME.WebApi.Models.Root”。路径'',第 1 行,位置 129。
  • 第 129 位是什么?
  • @PanagiotisKanavos 非常感谢您的时间和帮助。汉里建议的工作。最初,从 rest 调用返回的文本具有前导和尾随反斜杠。将其转换为字符串并将其反序列化为我创建的对象非常有效。
猜你喜欢
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2023-04-04
  • 2017-06-16
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多