C# Json.net:在内部列表中转换忽略主类
我有一个JSON字符串,如下所示:C# Json.net:在内部列表中转换忽略主类,c#,json,json.net,C#,Json,Json.net,我有一个JSON字符串,如下所示: { "Items" [ { "A":"123", "B":"ABC"},{ "A":"345", "B":"CCC"},{ "A":"567", "B":"HGF"}] } [{A:123,B:ABC},{A:345,B:CCC},{A:567,B:HGF}] 反序列化的目标类是: public class Response { public Item[] Items { get; set; } } public class Item {
{ "Items" [ { "A":"123", "B":"ABC"},{ "A":"345", "B":"CCC"},{ "A":"567", "B":"HGF"}] }
[{A:123,B:ABC},{A:345,B:CCC},{A:567,B:HGF}]
反序列化的目标类是:
public class Response
{
public Item[] Items { get; set; }
}
public class Item
{
public string A { get; set; }
public string B { get; set; }
}
当我以这种方式反序列化时,它不起作用,它希望主类以某种方式出现:
Response resp = (Response)JsonConvert.DeserializeObject(content, typeof(Response));
为了让它发挥作用,我必须:
List<Item> resp = (List<Item>)JsonConvert.DeserializeObject(content, typeof(List<Item>));
有没有一种方法,可能是注释Response类,以获得我期望的结果:Response实例中填充了Item对象
感谢您使用自定义JsonConverter对响应类进行反序列化和注释:
public class ResponseConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Response);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null) return null;
//Construct Response from incoming array
JArray arr = JArray.Load(reader);
var response = new Response();
var itemList = new List<Item>();
foreach (var item in arr)
{
var i = new Item();
i.A = (string)item["A"];
i.B = (string)item["B"];
itemList.Add(i);
}
response.Items = itemList.ToArray();
return response;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
//Currently not implemented, converter supports only deserializing.
// If you want to support also serialising, implement this method
throw new NotImplementedException();
}
}
最后,您可以将json反序列化为Response-object:
乍一看,JSON字符串似乎不适合响应类的格式。如果是这样的话,那么它看起来是这样的:
{ "Items" [ { "A":"123", "B":"ABC"},{ "A":"345", "B":"CCC"},{ "A":"567", "B":"HGF"}] }
因此,要么需要相应地调整响应字符串,要么调整类
或者,如果您希望保持类和响应不变,那么您需要做更多的工作:
var resp = new Response() { Items = JsonConvert.DeserializeObject<List<Item>>(content).ToArray() };
可能需要调整,因为我在飞行中这样做
这里有一个关于如何用JSON字符串映射类的链接
现在,您可以反序列化一个列表:var resp=JsonConvert.DeserializeObjectcontent@Jimi yep,这就是工作原理,但由于它属于更大的代码库,我宁愿更改类注释以适应它。我想保留resp=ResponseJsonConvert.DeserializeObjectcontent,typeofResponse;因为它是一个更大的代码库?那么,这只是JSON的一部分吗?@Jimi no。JSON是您看到的,但是反序列化部分是动态创建的,因此它需要主类,我无法更改
var resp = new Response() { Items = JsonConvert.DeserializeObject<List<Item>>(content).ToArray() };