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

C#反序列化Json字符串

c# 反序列化 Json 字符串

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

Json反序列化器或正则表达式或Json解析以在c#中转换Json字符串

C# json字符串反序列化

无法反序列化json字符串c#