Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Json.net:在内部列表中转换忽略主类_C#_Json_Json.net - Fatal编程技术网

C# Json.net:在内部列表中转换忽略主类

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 {

我有一个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
{
    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() };