1

JSON.NET を使用して、サードパーティの Web サービスからの応答を逆シリアル化しようとしています。これは、私がやろうとしていることを示す私の(不自然な)例の完全なコードです:

namespace JsonNetTests
{
public enum Parameter
{
    Alpha = 1,
    Bravo = 2,
    Charlie = 3,
    Delta = 4
}

public class ResponseElement
{
    public int Id { get; set; }

    public string Name { get; set; }

    [JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
    public Parameter[] Parameters { get; set; }
}

public class ResponseBody
{
    public string Locale { get; set; }
    public string[] Errors { get; set; }
    public ResponseElement[] ResponseElements { get; set; }
}

[TestFixture]
public class JsonNetTest
{
    [Test]
    public void TestEnumArray()
    {
        string jsonResponse = @"
{""ResponseBody"": {
""Locale"": ""en-US"",
""Errors"": [],
""ResponseElements"": [{
    ""Id"": 1,
    ""Name"": ""ABC"",
    ""Parameters"" : {
        ""Parameter"" : ""Alpha""
    },
    }, {
    ""Id"": 2,
    ""Name"": ""BCD"",
    ""Parameters"" : {
        ""Parameter"" : ""Bravo""
    },
    }
]
}}
";

        JObject rootObject = JObject.Parse(jsonResponse);
        JToken rootToken = rootObject.SelectToken("ResponseBody");

        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.MissingMemberHandling = MissingMemberHandling.Error;

        ResponseBody body = JsonConvert.DeserializeObject<ResponseBody>(rootToken.ToString(), settings);

        foreach (var element in body.ResponseElements)
        {
            Console.WriteLine(string.Format("{0}: {1}", element.Id, element.Name));
            foreach (var parameter in element.Parameters)
            {
                Console.WriteLine(string.Format("\t{0}", parameter));
            }
        }
    }
}
}

次の例外が発生します。

Newtonsoft.Json.JsonSerializationException : JSON オブジェクト (つまり、{"name":"value"}) を型 'JsonNetTests.Parameter[]' に逆シリアル化できません。逆シリアル化された型は、通常の .NET 型 (つまり、整数のようなプリミティブ型ではなく、配列やリストのようなコレクション型ではない) またはディクショナリ型 (つまり、ディクショナリ) である必要があります。JSON オブジェクトを強制的に逆シリアル化するには、JsonObjectAttribute を型に追加します。パス 'ResponseElements[0].Parameters.Parameter'、行 9、位置 21。

ItemConverterType 属性を使用して、配列を逆シリアル化する方法を指定しようとしました。

[JsonProperty(ItemConverterType = typeof(StringEnumConverter))]

しかし、これも役に立ちません。誰かがアドバイスできますか?

4

1 に答える 1

0

オブジェクトを配列に詰め込もうとしています。ResponseElement.Parameters は、json コードがオブジェクトを使用して各パラメーターを記述している列挙型の配列です。

json は次のようになります。

// some json
"Parameters" : {
    "Parameter" : "Alpha"
},
// more json

しかし、これを列挙型の配列に変換するには、次のようにする必要があります。

// some json
"Parameters" : [ "Alpha", "Bravo" ],
// more json

json を変更できない場合は、次のようにモデルを変更できます。

public enum ParameterEnum 
{
    Alpha = 1,
    Bravo = 2
}

public ParameterContainer
{
    [JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
    public ParameterEnum Parameter {get;set;}
}

public class ResponseElement
{
    public int Id { get; set; }

    public string Name { get; set; }

    public ParameterContainer[] Parameters { get; set; }
}

事実上、json を ParameterContainers の配列にシリアル化し、それらの値を公開します。

于 2012-05-22T19:18:02.093 に答える