C#反序列化Json字符串
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#反序列化Json字符串相关的知识,希望对你有一定的参考价值。
参考技术A 方法是:using Newtonsoft.Json;
。。。
JsonConvert.DeserializeObject<。。。>(strJson)
示例1:
[csharp] view plaincopyprint?
public class ViewTag
public int ViewId get; set;
public string Name get; set;
public bool IsValid get; set;
public int Seq get; set;
public byte ChangeType get; set;
string strJson = "['ViewId':14,'Name':'view 1','IsValid':true,'Seq':'1','ChangeType':0,'ViewId':15,'Name':'view 2','IsValid':true,'Seq':'2','ChangeType':0]";
List<ViewTag> list = JsonConvert.DeserializeObject<List<ViewTag>>(strJson);
上述例子中,json字符串内,每个json元素的数据结构都一样。但假如不一样,怎么办?
示例2:
[csharp] view plaincopyprint?
string strJson = @"[
'id':1,
'text':'All Object',
'iconCls':'',
'children':[
'id':11,
'text':'Key attributes',
'children':[
'id':111,
'text':'Item1'
,
'id':112,
'text':'Item2'
,
'id':113,
'text':'Item3'
]
,
'id':12,
'text':'Service table 1',
'state':'closed',
'children':[
'id':121,
'text':'Service 1'
,
'id':122,
'text':'Service 2'
,
'id':123,
'text':'Service 3'
]
,
'id':13,
'text':'Service table 2',
'state':'closed',
'children':[
'id':131,
'text':'Service 1'
,
'id':132,
'text':'Service 2'
,
'id':133,
'text':'Service 3'
]
,
'id':14,
'text':'Service table 3'
]
]";
return JsonConvert.DeserializeObject<List<object>>(strJson);
C#反序列化一个序列化的JSON字符串[关闭]
【中文标题】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字符串的主要内容,如果未能解决你的问题,请参考以下文章