反序列化数组中的数组

Del*_*ino 5 c# json json.net deserialization

我刚下载了一个包含所有当前MTG集/卡巨大 JSON文件,我希望将其全部反序列化.

我已经将每个set的大部分反序列化了,但是当我尝试反序列化booster每个Set中的对象时,我遇到了障碍:

在此输入图像描述

在此输入图像描述

从上面两张图片中可以看出,每个booster对象都有一个字符串列表,但是对于某些booster对象,还有一个更多字符串的附加数组.反序列化一个专门的字符串数组不是问题.当我遇到那里是一个字符串数组的情况下,我的问题出现之内booster需要反序列化对象.

目前我设置的用于处理此反序列化的属性是:

public IEnumerable<string> booster { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是当我遇到其中有另一个数组的情况时,booster我会抛出一个异常,Newtonsoft.Json抱怨它不知道如何处理反序列化.

那么,我的问题就变成了:如何反序列化字符串数组中包含的字符串数组?在C#代码中,对象需要用什么来处理那种反序列化?

luc*_*cky 1

您可以反序列化每个项目,string[]甚至认为该项目不是集合。因此,提供一个自定义序列化器;

public class StringArrayConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JArray array = JArray.Load(reader);
        for (int i = 0; i < array.Count; i++)
        {
            //If item is just a string, convert it string collection
            if (array[i].Type == JTokenType.String)
            {
                array[i] = JToken.FromObject(new List<string> {array[i].ToObject<string>()});
            }
        }
        return array.ToObject<List<string[]>>();
    }

    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(List<string[]>));
    }
}
public class JsonObject
{
    [JsonConverter(typeof(StringArrayConverter))]
    public List<string[]> booster { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后反序列化json;

var data = JsonConvert.DeserializeObject<JsonObject>(json);
Run Code Online (Sandbox Code Playgroud)

最后,您可以像我下面提供的那样反序列化 json;

{
    "booster": [
      "1",
      "2",
          ["3","4"]
    ]
}
Run Code Online (Sandbox Code Playgroud)