在 C# 中反序列化复杂对象

Posted

技术标签:

【中文标题】在 C# 中反序列化复杂对象【英文标题】:deserialize complex object in C# 【发布时间】:2021-09-23 07:53:34 【问题描述】:

我有一个无法反序列化的 JSON 对象。它失败并出现以下错误:

Newtonsoft.Json.JsonSerializationException: '无法将当前 JSON 对象(例如 "name":"value")反序列化为类型 'System.Collections.Generic.List1[SampleObj]',因为该类型需要 JSON 数组。

JSON:

"\"rows\":
     [
      \"ID\":1,
       \"Name\":\"Puz\"
      ,
       
      \"ID\":2,
        \"Name\":\"Kez\"
      
        
    ]
"

我已尝试使用 Newtonsoft 进行跟踪:

var deserializeObject = JsonConvert.DeserializeObject<List<SampleObj>>(jsonString);

下面的尝试是使用 javascriptSerializer。

JavaScriptSerializer oJS = new JavaScriptSerializer();
List<SampleObj> deserializeObject = new List<ReportColumns>();
deserializeObject = oJS.Deserialize<List<ReportColumns>>(jsonString);

但两者都报错。

【问题讨论】:

“我遇到了一个错误” - 你能包括那个错误 ....吗?以及你的SampleObj-class 是什么样的? 第一种方法我得到Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (e.g. "name":"value") into type 'System.Collections.Generic.List1[SampleObj]' 因为类型需要 JSON 数组`这个错误 包含您尝试反序列化到的类定义 【参考方案1】:

您的反序列化类似乎与提供的 JSON 结构不匹配。像这样的东西应该适合你:

public class Foo

  public List<Bar> rows  get; set; 


public class Bar

  public int ID  get; set; 
  public string Name  get; set; 


Foo deserializeObject = oJS.Deserialize<Foo>(jsonString);

【讨论】:

【参考方案2】:

Newtonsoft 可以使用以下命令安装:

PM>Install-Package Newtonsoft.Json -Version 13.0.1

示例用法:

string json = @"
  'Email': 'james@example.com',
  'Active': true,
  'CreatedDate': '2013-01-20T00:00:00Z',
  'Roles': [
    'User',
    'Admin'
  ]
";

Account account = JsonConvert.DeserializeObject<Account>(json);

Console.WriteLine(account.Email);

【讨论】:

以上是关于在 C# 中反序列化复杂对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中反序列化多个 JSON 对象?

C# 在单个对象中反序列化两个 Jarray 对象

无论如何在 C# 中反序列化之前检查对象的类类型?

使用 LitJson 在 C# 中反序列化 JSON 对象数组 [重复]

无法在 C# 中反序列化 JSON 结果。输入字符串格式不正确错误

在 C# 中反序列化 JSON 数组