3

使用している API が一貫性のない JSON を返している状況があり、JSON.NET を使用して逆シリアル化したいと考えています。1 つのケースでは、オブジェクトを含むオブジェクトを返します (外側の "1" は任意の数であることに注意してください)。

{
   "1":{
      "0":{
         "db_id":"12835424",
         "title":"XXX"
      },
      "1":{
         "db_id":"12768978",
         "title":"YYY"
      },
      "2":{
         "db_id":"12768980",
         "title":"ZZZ"
      },
      "3":{
         "db_id":"12768981",
         "title":"PPP"
      }
   }
}

別のケースでは、オブジェクトの配列を返します。

{
   "3":[
      {
         "db_id":"12769199",
         "title":"XXX"
      },
      {
         "db_id":"12769200",
         "title":"YYY"
      },
      {
         "db_id":"12769202",
         "title":"ZZZ"
      },
      {
         "db_id":"12769243",
         "title":"PPP"
      }
   ]
}

この不一致が存在する理由はわかりませんが、これが私が取り組んでいる形式です。メソッドで両方のフォーマットを逆シリアル化する正しい方法は何でしょうJsonConvert.DeserializeObjectか?

4

2 に答える 2

13

現在のバージョンの Json.NET (Json.NET 4.5 Release 11) では、オブジェクトとして、場合によっては配列として逆シリアル化する Json を処理するCustomCreationConverterを次に示します。

public class ObjectToArrayConverter<T> : CustomCreationConverter<List<T>> where T : new() 
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        List<T> target = new List<T>();

        try
        {
            // Load JObject from stream
            JArray jArray = JArray.Load(reader);

            // Populate the object properties
            serializer.Populate(jArray.CreateReader(), target);
        }
        catch (JsonReaderException)
        {
            // Handle case when object is not an array...

            // Load JObject from stream
            JObject jObject = JObject.Load(reader);

            // Create target object based on JObject
            T t = new T();

            // Populate the object properties
            serializer.Populate(jObject.CreateReader(), t);

            target.Add(t);
        }

        return target;
    }

    public override List<T> Create(Type objectType)
    {
        return new List<T>();
    }
}

使用例:

[JsonObject]
public class Project
{
    [JsonProperty]
    public string id { get; set; }

    // The Json for this property sometimes comes in as an array of task objects, 
    // and sometimes it is just a single task object.
    [JsonProperty]
    [JsonConverter(typeof(ObjectToArrayConverter<Task>))]
    public List<Task> tasks{ get; set; }
}

[JsonObject]
public class Task
{
    [JsonProperty]
    public string name { get; set; }

    [JsonProperty]
    public DateTime due { get; set; }
}
于 2013-01-13T08:09:29.773 に答える
2

これはJsonCreationConverterを作成することで可能になるはずだと思います。この記事はおそらく役立つでしょう: http://dotnetbyexample.blogspot.nl/2012/02/json-deserialization-with-jsonnet-class.html

于 2012-06-04T09:35:17.853 に答える