3

次のJSONをWebAPI(JSON.Net)で逆シリアル化するにはどうすればよいですか?:

{
    "action": "edit",
    "table": "MainView",
    "id": "row_1377",
    "_group_id": "999",
    "data": {
        "ROTATION": "1", // This name/val can change
        "EQUIPMENT": [{
            "id": "6"
        },
        {
            "id": "8"
        }],
        "NOTES": ""
    }
}

の値は列を表し、変更される可能性があるため、 json.netdataのように「NOTES」という名前の文字列を使用してset-in-stoneオブジェクトを作成することはできません。文字列は、ネストされたクラスに逆シリアル化されます。

通知EQUIPMENTには複数の値が含まれています。以前はのような「string:string」でしたがNOTES、このJSONはに逆シリアルdata化されましたDictionary<string, string>が、今では独自の辞書のように動作する必要があります。私の最後の試みは、次のタイプに逆シリアル化することでした。

public class EditorSubmissionJoined
{
    public string _group_id { get; set; }
    public string action { get; set; }
    public string table { get; set; }
    public string id { get; set; }
    // "public" added below due to mistake noticed by Maggie Ying
    public Dictionary<string, object> data { get; set; } // Trouble
}

に(のような)または辞書(のような)のいずれかobjectに何でも含めることができることを望んでいました。dataKeyValuePairNOTESEQUIPMENT

Dictionary<string, ICollection<Object>>、、、Objectさらにはを試しましICollection<Dictionary<string, Object>>た。

問題は、私のコントローラーが常にnull値のみでEditorSubmissionJoinedを取得することです。

public void Put(EditorSubmissionJoined ajaxSubmission) {
    // ajaxSubmission has only NULL values
}
4

2 に答える 2

2

'data'プロパティをpublicに設定してみてください。そうすれば、JSONはバインドを正しくモデル化できるはずです。

于 2012-10-10T23:44:19.767 に答える
1

あなたがそれをすることができるいくつかの方法があります。1つの方法は、単にaを使用してJObject、名前でフィールドにアクセスすることです。例:jsonObject["data"]["ROTATION"]。これを使用して「逆シリアル化」しJObject.Parse、JSONテキストをに「解析」することができますJObject

JsonConverterまたは、独自に記述して、特定のタイプを逆シリアル化するときにそのコンバーターを使用するようにJSON.netに指示することもできます(例JsonConverterAttribute)。これには、ReadJsonオーバーライドでJSONテキストの一部を手動で解析する必要があり、実際には、期待するデータによって異なります。

プレストンがコメントした動的アプローチを使用することもできます。

どのアプローチを選択するかは、物事をどれだけ強くタイプしたいかによって異なります。

于 2012-10-10T23:49:05.767 に答える