0

我有一个结构如下的json:

{
   "result":
   [
      {"a":{"b":1,"c":2}},
      {"a":{"b":1,"c":2}},
      {"a":{"b":1,"c":2}},
      {"a":[]}
   ]
}

所以我创建了类结构来将其解析为 C# 对象:

public class JsonTest
{
   public JsonTestResult[] result;
}

public class JsonTestResult
{
   public JsonTestResultValue a;
}

public class JsonTestResultValue
{
   public int b;
   public int c;
}

当试图通过我解析这个时,LitJson我得到一个错误:

类型 JsonTestResultValue 不能充当数组

问题在于 json: 的这一部分{"a":[]},必须有{}而不是[],因为它实际上是一个对象,而不是数组。

现在我被困在这里,无法理解我必须为这个 json 属性使用哪种类型 - 数组或任何对象类型都不合适。我现在只想替换大括号(使用简单的正则表达式String.Replace),但我敢肯定,必须有更充分的方法来反序列化它。

4

2 回答 2

4

您需要做的是创建一个自定义转换器并使用继承。

首先,我进行了更改,以便有两个子类:

public class JsonTestObject
{

}

public class JsonTestResultValue : JsonTestObject
{
    public int b;
    public int c;
}

public class JsonTestResultArray : JsonTestObject
{
    public JArray Array { get; set; }

    public JsonTestResultArray(JArray array)
    {
        Array = array;
    }
}

主要结构中使用了哪些:

public class JsonTest
{
    public JsonTestResult[] result;
}

public class JsonTestResult
{
    public JsonTestObject a;
}

然后,我们需要能够确定要使用哪些子类。为此,我们可以检查开始标记是用于对象还是用于数组。这是在 a 内完成的JsonConverter

public class JsonTestConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(JsonTestObject).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader,
        Type objectType, object existingValue, JsonSerializer serializer)
    {
        //Is it an array?
        var token = reader.TokenType;
        if (token == JsonToken.StartArray)
        {
            var array = JArray.Load(reader);
            return new JsonTestResultArray(array);
        }

        var item = JObject.Load(reader);
        return item.ToObject<JsonTestResultValue>();
    }

    public override bool CanWrite
    {
        get { return false; }
    }

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

最后,您必须在反序列化时指定转换器:

class Program
{
    static void Main(string[] args)
    {
        var str = @"{
        ""result"":
        [
           {""a"":{""b"":1,""c"":2}},
           {""a"":{""b"":1,""c"":2}},
           {""a"":{""b"":1,""c"":2}},
           {""a"":[]}
        ]
    }";
        var deserializedObject = JsonConvert.DeserializeObject<JsonTest>(str, new JsonTestConverter());

    }
}

您可能希望根据您在JsonTestResultArray.

于 2014-08-08T05:45:53.717 回答
0

首先尝试将 JSON 解析为 array 。然后遍历数组并在循环内创建对象。

例子

   for(int i = 0 ; i>=JsonArray.Length - 1; i++)
   {
      result[i] = JSON.Deserlize(JsonArray[i]);
   }

PS:不是测试代码只是为了给你一个想法。

于 2014-08-08T05:50:12.320 回答