2

次のような JSON データを返すサービスの応答 DTO をモデル化しています。

{
    "response":
    {
        "metadataA" : "useless info a",
        "metadataB" : "useless info b",
        "metadataC" : "useless info c",
        ...
        "metadataZ" : "useless info z",
        "results" :
        [
            {
                "resultmetadataA" : "useless info a",
                "resultmetadataB" : "useless info b",
                "resultId": "a",
                "resultName": "A"
            },
            {
                "resultmetadataA" : "useless info a",
                "resultmetadataB" : "useless info b",
                "resultId": "b",
                "resultName": "B"
            }

        ]
    }
}

明らかに、DTO に次のような ID と名前を含む結果のリストが必要なだけです。

class Response
{
    public List<Result> Results { get; set; }
}

class Result
{
    public string Id  { get; set; }
    public string Name  { get; set; }
}

ID と名前の値の「パス」を Service Stack に伝えるプロパティ属性はありますか?


編集 1

ServiceStack.DataAnnotations からいくつかの属性を使用しようとしていますが、うまくいきません。プロパティでCompositeIndex (false, "response", "result")ResultsAliasを使用しようとしましResultsたが、結果が null になり続けます。

助けてください!

編集 2

[DataContract]Response と[DataMember(Name = Id/Name)]プロパティでそれらのデータを直接解析することも試みましたが、うまくいかないようです。

4

3 に答える 3

3

辞書を使用できます:

public class ResponseDTO
{
    public List<Dictionary<string, string>> Results { get; set; }
}
于 2013-04-17T16:20:32.863 に答える
1

まず、JSON は無効"response": [です。配列リテラルにすることはできませんが、オブジェクト プロパティを含めることができます。

シリアル化の問題をデバッグする方法

目標は、スキーマが JSON の形状と一致することです。形状がどうあるべきかを推測しようとするのではなく、形状を推測する習慣を身につけ、どのプロパティがシリアル化されるかを試してみてください。プロパティがシリアル化されていない場合は、逆の手順を実行し、POCO を入力およびシリアル化して、予想される形状を確認し、形状を元の JSON と比較して、それらがどこで異なるかを確認します。シリアル化の問題のデバッグに関するその他のヒントについては、この回答を参照してください。

var json = @"{
    ""response"":
    {
        ""metadataA"" : ""useless info a"",
        ""metadataB"" : ""useless info b"",
        ""metadataC"" : ""useless info c"",
        ""metadataZ"" : ""useless info z"",
        ""results"" :
        [
            {
                ""resultmetadataA"" : ""useless info a"",
                ""resultmetadataB"" : ""useless info b"",
                ""resultId"": ""a"",
                ""resultName"": ""A""
            },
            {
                ""resultmetadataA"" : ""useless info a"",
                ""resultmetadataB"" : ""useless info b"",
                ""resultId"": ""b"",
                ""resultName"": ""B""
            }

        ]
    }
}";

上記の JSON から推測される型:

public class MetadataResponse
{
    public Response Response { get; set; }
}

public class Response
{
    public string MetadataA { get; set; }
    public string MetadataB { get; set; }
    public string MetadataC { get; set; }
    public string MetadataZ { get; set; }
    public List<Result> Results { get; set; }
}

public class Result
{
    public string ResultmetadataA { get; set; }
    public string ResultmetadataB { get; set; }
    public string ResultId { get; set; }
    public string ResultName { get; set; }
}

上記のタイプを使用して JSON シリアル化をテストします。

var dto = json.FromJson<MetadataResponse>();
dto.PrintDump();

出力:

{
    Response: 
    {
        MetadataA: useless info a,
        MetadataB: useless info b,
        MetadataC: useless info c,
        MetadataZ: useless info z,
        Results: 
        [
            {
                ResultmetadataA: useless info a,
                ResultmetadataB: useless info b,
                ResultId: a,
                ResultName: A
            },
            {
                ResultmetadataA: useless info a,
                ResultmetadataB: useless info b,
                ResultId: b,
                ResultName: B
            }
        ]
    }
}
于 2013-04-17T19:44:33.537 に答える