0

一部のテストが機能していない理由 (TDD) を理解しようとしており、クラスのシリアル化まで追跡できましたが、なぜ機能していないのかわかりません。単純なバージョンとより複雑なバージョンの 2 つのフレーバーがあります。少し複雑なバージョンでは、Parameter.Value 内に値の配列が含まれます。

単純なバージョンです。これを使用してシリアル化できるクラスがありますJavaScriptSerializer(MVC が JSON を生成するときに、これがどのように機能するかを想定しています)。生成される構造は次のようになります。

{
   "Name": "TestQuery",
   "QueryId": 1,
   "Parameters": [
   {
        "Name": "MyString",
        "DataType": 0,
        "Value": "A String",
        "IsArray": false
    }],
   "Sql": "SELECT * FROM Queries"
}

3 つの C# クラスQuery( ParameterCollectiona KeyedCollection<String, Parameter>) と a がありParameterます。これらはすべてDataContract/DataMember属性でマークアップされDataContractSerializer、問題なく を介してシリアル化されます。

JavaScriptSerializerただし、オブジェクトを上記の JSON に正しくシリアル化しますが、逆シリアル化時にパラメーターがなく、見逃されているようです。

なぜこれらが失敗するのか、それを修正するために何ができるのか、誰にも分かりますか?

4

1 に答える 1

1

なぜKeyedCollection<String, Parameter>ですか?辞書ではなく配列があるため、JSON は次の構造と一致する必要があります。

public class Query
{
    public int QueryId { get; set; }
    public string Name { get; set; }
    public string Sql { get; set; }
    public Parameter[] Parameters { get; set; }
}

public class Parameter
{
    public string Name { get; set; }
    public int DataType { get; set; }
    public string Value { get; set; }
    public bool IsArray { get; set; }
}

その後、問題なく逆シリアル化できます。

var serializer = new JavaScriptSerializer();
var json = @"
{
   ""Name"": ""TestQuery"",
   ""QueryId"": 1,
   ""Parameters"": [
   {
        ""Name"": ""MyString"",
        ""DataType"": 0,
        ""Value"": ""A String"",
        ""IsArray"": false
    }],
   ""Sql"": ""SELECT * FROM Queries""
}";
var query = serializer.Deserialize<Query>(json);

[Data*]ビューモデルから属性を取り除くこともできます。属性はJavaScriptSerializerクラスでは使用されません。

于 2013-02-22T09:31:08.133 に答える