当Json有一个更深一层的数组时,如何用C#将Json字符串转换为Json.Net中有列表的类

本文关键字:Json 转换 字符串 Net 列表 何用 深一层 有一个 数组 | 更新日期: 2023-09-27 18:20:05

我有一个C#应用程序,我在其中使用Nuget中的Json.Net。我从服务器上得到一个json,需要将其转换为C#对象,经过一些修改后,我会将其作为json发送回服务器。

这是我在C#中的模型(转换服务器xsd后得到的)

public class Tags
{
    public List<Tag> tagData { get; set; }
}
public class Tag
{
    public string name {get; set;}
}

这是我从服务器上获得的JSON字符串,并尝试转换为我的模型

//Json string obtained from server (hardcoded here for simplicity)
string json = "{tagData: {tags : [ { name : '"John'"}, { name : '"Sherlock'"}]}}";
//An attempt at conversion
var output = JsonConvert.DeserializeObject<Tags>(json);

这是我在上面的代码中得到的例外

An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll
Additional information: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[jsonnetExample.Tag]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'tagData.tags', line 1, position 17.

在理解了上面的消息后,我尝试了以下2件事,希望能修复它。

A.我试着在我的第一个模型上加一个JsonProperty。

[JsonProperty(PropertyName = "tags")]

这不再引发异常,但输出tagData为null。

B。我修改了我的模型如下

public class Tags
{
    public WrapTag tagData { get; set; }
}
public class WrapTag
{
    public List<Tag> tags { get; set; }
}
public class Tag
{
    public string name {get; set;}
}

这并没有引发任何异常,并按预期填充了对象。但是现在我失去了xsd(来自服务器的类)到我的客户端模型类之间的一一映射。是否可以在不创建WrapTag类的情况下使这种反序列化工作?

如果有人能为我指明正确的方向,我将非常高兴。提前谢谢。

当Json有一个更深一层的数组时,如何用C#将Json字符串转换为Json.Net中有列表的类

这里有一个选项,使用JObject.Parse:

string json = "{tagData: {tags : [ { name : '"John'"}, { name : '"Sherlock'"}]}}";
List<Tag> tagList = JObject.Parse(json)["tagData"]["tags"].ToObject<List<Tag>>();
// or:
// List<Tag> tagList = JObject.Parse(json).SelectToken("tagData.tags")
//    .ToObject<List<Tag>>();
Tags tags = new Tags { tagData = tagList };