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字符串[关闭]的主要内容,如果未能解决你的问题,请参考以下文章