C#反序列化一个序列化的JSON字符串[关闭]

Posted

技术标签:

【中文标题】C#反序列化一个序列化的JSON字符串[关闭]【英文标题】:C# Deserialize a Serialized JSON string [closed] 【发布时间】:2021-12-27 21:11:29 【问题描述】:

这是我收到的 JSON 字符串


   "Date":"2021-11-16",
   "Name":"Raj",
   "BError":
      "code":"errorcode",
      "details":"message"
   ,
   "AStatus":true

我必须反序列化上面的 JSON 字符串

我在下面给出了带有 JSON 注释的类详细信息

public class Demo

    [JsonProperty("Date")]
    public DateTime? Date  get; set; 
    
    pulic string Name  get; set; 
    
    [JsonProperty("B-Error")]
    public BError BError  get; set; 
    
    [JsonProperty("A-Status")]
    public bool AStatus  get; set; 

    
public class BError

    public string code  get; set; 
    public string details  get; set; 

我写反序列化的代码是

var responseJson = JsonConvert.DeserializeObject(input_JSON_string).ToString();
Demo d = JsonConvert.DeserializeObject<Demo>(responseJson);

此代码将 input_JSON_string 转换为对象,但不是所有字段。 “Date”和“Name”字段正在转换,但“B-Error”和“A-Status”字段将值存储为 NULL。

如何反序列化所有字段?

【问题讨论】:

您不需要在上面定义JsonProperty - 它通常在您的属性名称不同于JSON 等时使用。 -并且基于上述,他们不... @EdSF 你这么说.. 但是人们会忘记在里面放一个camelCasing转换器,所以所有的 serialized json 都以 PascalCase 结尾;好哇。 JsonProperty 在所有方面的一个好处是序列化部分要记住的事情少了一件(而且很容易产生 json-to-csharp 类型转换器) 如下所述,JSON 和代码不匹配 - 您必须更改代码(只需删除属性)或将连字符添加到 JSON 中的 A-Error/B-Error。 @CaiusJard 当然,但那将意味着它们不同因此...... 我想 JsonPropping 的另一个好处是你可以随意重构.. 【参考方案1】:

这应该是 json 中属性的名称

[JsonProperty("B-Error")]

"B-Error" 不是您的 json 中的属性名称;您的 json 属性称为 "BError" - 您似乎在 A-Status 上有类似的拼写错误

这样做,一切都会好起来的:

[JsonProperty("BError")]

JsonProperty 允许您拥有称为一个事物的 C# 属性,这些属性连接到称为另一个事物的 json 属性。这意味着您可以为您的 c# 属性维护 c# 命名约定(您应该将您的 c# 属性 code 重命名为 Code),即使 json 的命名方式不像 c# 那样

要获得完整的工作类以及有关如何反序列化的提示,只需将您的 json 粘贴到 https://QuickType.io

【讨论】:

我知道将 json 属性从“BError”更改为“B-Error”会起作用,但我不应该更改它 你应该改变JsonProperty来匹配json,而不是改变json来匹配JsonProperty!【参考方案2】:

如果你想要它,你可以添加一个构造函数

public partial class Demo

    [JsonProperty("Date")]
    public DateTimeOffset Date  get; set; 

    [JsonProperty("Name")]
    public string Name  get; set; 

    [JsonProperty("B-Error")]
    public BError BError  get; set; 

    [JsonProperty("A-Status")]
    public bool AStatus  get; set; 
    
    [JsonConstructor]
    public Demo(DateTimeOffset Date,string Name, BError BError, bool AStatus)
    
        this.Date=Date;
        this.Name=Name;
        this.BError=BError;
        this.AStatus=AStatus;
    

public partial class BError

    [JsonProperty("code")]
    public string Code  get; set; 

    [JsonProperty("details")]
    public string Details  get; set; 

这个 json 已经过测试,代码运行正常


   "Date":"2021-11-16",
   "Name":"Raj",
   "BError":
      "code":"errorcode",
      "details":"message"
   ,
   "AStatus":true

【讨论】:

不,我想要带有 hypen 的 JsonProperties (B-Error , A-Status) 你必须改变你的json然后 不改变其中任何一个我们不能得到结果? 它有什么意义?您必须使用 hypen 制作 json,否则没有其他方法。属性不做任何事情。你不能用 hypen 来创建 c# 属性 如果你绝对有,你可以尝试一些技巧,例如在输入字符串中用“A-Error”替换“AError” - 我看不到你的意思。 responseJson = responseJson.Replace("AError", "A-Error");

以上是关于C#反序列化一个序列化的JSON字符串[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C# json字符串反序列化

C# JSON 反序列化

JSON TO C#反序列化[关闭]

无法将 JSON 数组反序列化为 C# 对象 [关闭]

unity C#中使用Newtonsoft.Json进行字符串的序列化和反序列化简易教程

unity C#中使用Newtonsoft.Json进行字符串的序列化和反序列化简易教程