当前位置: 首页 > 知识库问答 >
问题:

无法在c中反序列化JSON#

暨弘毅
2023-03-14

我从 REST API 获得以下 JSON 作为响应。

{
   "data":{
      "id":123,
      "zoneid":"mydomain.com",
      "parent_id":null,
      "name":"jaz",
      "content":"172.1 6.15.235",
      "ttl":60,
      "priority":null,
      "type":"A",
      "regions":[
         "global"
      ],
      "system_record":false,
      "created_at":"2017-09-28T12:12:17Z",
      "updated_at":"2017-09-28T12:12:17Z"
   }
}

并尝试使用下面的代码进行解析,但这不会导致正确的反序列化类型。

var model = JsonConvert.DeserializeObject<ResponseModel>(response);           

下面是我在JSON响应中收到的字段的类。

 public class ResponseModel
{
    public int id { get; set; }
    public string zone_id { get; set; }
    public int parent_id { get; set; }
    public string name { get; set; }
    public string content { get; set; }
    public int ttl { get; set; }
    public int priority { get; set; }
    public string type { get; set; }
    public string[] regions { get; set; }
    public bool system_record { get; set; }
    public DateTime created_at { get; set; }
    public DateTime updated_at { get; set; }

}

缺少了什么?

共有3个答案

糜昌胤
2023-03-14

这里有一个很酷的技巧,你可以在Visual Studio 2015-2017中做,如果你只是复制JSON(ctrl c),它会生成正确的类。

你需要在visual studio中创建一个新的类,然后在类中进入编辑菜单-

生成json类的步骤

这将为您生成该json的C#对象并为您节省所有麻烦:)

赖淇
2023-03-14

根据json2charp网站,您的模型似乎不正确。试试这个:

public class ResponseModel
{
    public int id { get; set; }
    public string zoneid { get; set; }
    public object parent_id { get; set; }
    public string name { get; set; }
    public string content { get; set; }
    public int ttl { get; set; }
    public object priority { get; set; }
    public string type { get; set; }
    public List<string> regions { get; set; }
    public bool system_record { get; set; }
    public DateTime created_at { get; set; }
    public DateTime updated_at { get; set; }
}

public class RootObject
{
    public ResponseModel data { get; set; }
}
百里鸿祯
2023-03-14

您缺少包装类。

public class Wrapper 
{
   public ResponseModel data {get;set}
}

然后做:

var model = JsonConvert.DeserializeObject<Wrapper>(response).data; 

从< code>data属性获取ResponseModel的实例。

你可以从你的json中扣除这个:

{ "data": 
   { "id":123, /*rest omitted */ }
}

将接收此 JSON 的类型需要具有名为 data 的属性。建议的包装类充当该类型。

 类似资料:
  • 我使用协议缓冲区在c和c#客户机-服务器应用程序之间发送和接收数据。我用protobuf网来解决这个问题。我有两个原始文件,一个请求命令和一个响应命令。我能够将命令从c#客户端发送到c服务器并进行反序列化。但我不能用c#反序列化。 我在缓冲区中以字节为单位获取数据,但它不会在响应命令中反序列化。

  • 问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是

  • 我试图反序列化javax.ws.rs.core.MultiValuedHashMap。 MultivaluedHashMap实现java.io.Serializable,并且有一个公共的、没有arg构造函数。 提前感谢你的帮助。

  • 问题内容: 作为一个小项目,我一直在尝试做一个小事,它可以读取序列化的lambda(从本地或从FTP)并调用它们的运行函数作为测试的一部分,以测试Windows中的文件关联(即打开某些文件类型)使用特定程序打开它们),但不管如何,无论如何,它似乎从未正确地反序列化。 lambda被这样声明 并使用由ObjectOutputStream包装的[n可选] BufferedOutputStream包装的

  • 问题内容: 在hibernate状态下执行条件查询时,出现以下异常: 可能是什么问题呢? PS:虽然可能不相关,但我的hibernate版本是hibernate-4.0.1 final。 问题答案: 问题在于被引用的实体对实体有另一个引用,并且该关系未由任何-like注释进行注释。

  • 问题内容: 我正在使用Hibernate的两个表,但我不明白为什么对于特定查询我有此问题。我希望有人意识到这个问题。 我有一个桌子用户 和一个桌子区域 日志说: 问题答案: 我建议仅在字段或getter上设置注释。我更喜欢田野,但那只是我的口味。 请参阅Hibernate中有关字段和属性访问的奇怪案例: 因此,要么将注释仅放置在字段上,要么仅放置在getters(properties)上。混合它们