3

true、false、または文字列配列の配列を含む JSON を返す API と通信しています。この JSON を逆シリアル化し、ブール値がある場合は、データ型 bool の Success というクラス フィールドに格納し、配列がある場合は、カスタム データ型の Result というフィールドに格納します。

これを達成するにはどうするのが最善ですか?

いくつかの JSON:

[
    {"status":"ok","result":true},
    {
        "status":"ok",
        "result":
        [
            {"name":"John Doe","UserIdentifier":"abc","MaxAccounts":"2"}
        ]
    }
]

私の結果クラス:

class Result
{
    string Name,
    string UserIdentifier,
    string MaxAccounts
}

API と通信するためのクラス:

class Api
{
    public string Status { get; set; }
    public Result[] Result { get; set; }
    public bool Success { get; set; }
}
4

2 に答える 2

4

JSON.NET を使用すると、カスタム JSON コンバーターを作成できます。たとえば、次のオブジェクトを持つことができます。

public class Root
{
    public string Status { get; set; }
    public Result Result { get; set; }
}

public class Result
{
    public bool? Value { get; set; }
    public Item[] Items { get; set; }
}

public class Item
{
    public string Name { get; set; }
    public string UserIdentifier { get; set; }
    public string MaxAccounts { get; set; }
}

JSONはに逆シリアル化されますRoot[]

カスタム JSON コンバーターは次のようになります。

public class ResultConverter: JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Result);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Boolean)
        {
            return new Result
            {
                Value = (bool)reader.Value,
            };
        }

        return new Result
        {
            Items = serializer.Deserialize<Item[]>(reader),
        };
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // If you want to support serializing you could implement this method as well
        throw new NotImplementedException();
    }
}

その後:

class Program
{
    static void Main()
    {
        var json = 
        @"[
            {
                ""status"": ""ok"",
                ""result"": true
            },
            {
                ""status"": ""ok"",
                ""result"": [
                    {
                        ""name"": ""John Doe"",
                        ""UserIdentifier"": ""abc"",
                        ""MaxAccounts"": ""2""
                    }
                ]
            }
        ]";

        var settings = new JsonSerializerSettings();
        settings.Converters.Add(new ResultConverter());
        Root[] root = JsonConvert.DeserializeObject<Root[]>(json, settings);
        // do something with the results here
    }
}
于 2013-07-29T12:17:14.773 に答える
0

Api および Results オブジェクトを使用して create および arraylist を作成します。私はこれを試してみましたが、うまくいきます。

        var api = new Api();
        var result = new Result();
        api.Status = "ok";
        api.Success = true;
        result.Name = "John Doe";
        result.UserIdentifier = "abc";
        result.MaxAccounts = "2";
        api.Result = new Result[1];
        api.Result[0] = result;
        var arrayList = new ArrayList() { new {api.Status, api.Success}, 
                        new { api.Status, api.Result} };
        var json = JsonConvert.SerializeObject(arrayList, Formatting.Indented);
于 2013-07-29T12:59:45.363 に答える