6

サーバーの応答を処理する必要があるクライアント アプリケーションを作成しています。応答は JSON です。Json.NET を使用してそれらを逆シリアル化することにしました。そして、これらの応答を (サーバー側で) 単純化または変更することはできませんでした。この特定の JSON 応答の特定の問題は、異なるオブジェクト タイプが同じ配列 (ファイルのハッシュと配列) にあることです。したがって、この配列を、オブジェクトの配列ではなく、厳密に型指定されたオブジェクトに直接デシリアライズしたいと思います。で達成できるはずだと思いますがCustomCreationConverter、方法がわかりませんでした。

JSON:

{
    "files":
    [
        "hash string",
        [
            ["first file name", 12],
            ["second file name", 34]
        ]
    ]
}

私が達成しようとしているオブジェクト構造:

public class RootObject
{
    [JsonProperty("files")]
    public FilesContainer Container
    {
        get;
        set;
    }
}

public class FilesContainer
{
    public string Hash
    {
        get;
        set;
    }

    public File[] Files
    {
        get;
        set;
    }
}

[JsonConverter(typeof(FileJsonConverter))]
public class File
{
    public string Name
    {
        get;
        set;
    }

    public int Size
    {
        get;
        set;
    }
}

class FileJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        File obj = new File
        {
            Name = reader.ReadAsString(),
            Size = reader.ReadAsInt32().GetValueOrDefault()
        };

        reader.Read();

        return obj;
    }

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

1 に答える 1

6

私は最終的にこれを行う方法を考え出しました。serializer.Deserializeの中で使用する必要がありJsonConverterました。だから、ここに実用的な例があります。

class Program
{
    static string json = @"{
                                ""files"":
                                [
                                    ""hash string"",
                                    [
                                        [""first file name"", 12],
                                        [""second file name"", 34]
                                    ]
                                ]
                            }";

    static void Main(string[] args)
    {
        RootObject container = JsonConvert.DeserializeObject<RootObject>(json);
    }
}

public class RootObject
{
    [JsonProperty("files")]
    public FilesContainer Container
    {
        get;
        set;
    }
}

[JsonConverter(typeof(FilesContainerJsonConverter))]
public class FilesContainer
{
    public string Hash
    {
        get;
        set;
    }

    public File[] Files
    {
        get;
        set;
    }
}

public class FilesContainerJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        FilesContainer obj = new FilesContainer();
        obj.Hash = reader.ReadAsString();
        reader.Read(); // to StartArray
        obj.Files = serializer.Deserialize<File[]>(reader);
        reader.Read(); // to EndArray

        return obj;
    }

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

[JsonConverter(typeof(FileJsonConverter))]
public class File
{
    public string Name
    {
        get;
        set;
    }

    public int Size
    {
        get;
        set;
    }
}

class FileJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        File obj = new File
        {
            Name = reader.ReadAsString(),
            Size = reader.ReadAsInt32().GetValueOrDefault()
        };

        reader.Read(); // to EndArray

        return obj;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
于 2012-10-26T06:36:37.323 に答える