当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类的情况下使这种反序列化工作?
如果有人能为我指明正确的方向,我将非常高兴。提前谢谢。
这里有一个选项,使用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 };