3

如何使用 Web API (JSON.Net) 反序列化以下 JSON?:

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

中的值data表示列并且可以更改,因此我无法使用例如名为“NOTES”的字符串创建一个固定对象,如json.net 将字符串反序列化为嵌套类

通知EQUIPMENT包含多个值。当它以前只是一个 "string:string" likeNOTES时,这个 JSON 反序列data化为 a 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
}

我希望无论是(like )还是字典(like )object都可以包含任何内容。dataKeyValuePairNOTESEQUIPMENT

我也试过Dictionary<string, ICollection<Object>>, Object, 甚至ICollection<Dictionary<string, Object>>.

问题是我的控制器总是得到只有空值的 EditorSubmissionJoined:

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

2 回答 2

2

尝试将您的“数据”属性设置为公共,您的 JSON 应该能够正确建模绑定。

于 2012-10-10T23:44:19.767 回答
1

有几种方法可以做到。一种方法是简单地使用 aJObject并按名称访问字段,例如:jsonObject["data"]["ROTATION"]。您可以使用“反序列化”它JObject.Parse并将 JSON 文本“解析”为JObject.

或者,您可以自己编写JsonConverter并告诉 JSON.net 在反序列化特定类型(例如JsonConverterAttribute)时使用该转换器。这需要在 ReadJson 覆盖中手动解析部分 JSON 文本,并且实际上取决于您期望的数据。

您还可以使用 Preston 评论的动态方法。

你选择哪种方法取决于你想要的东西有多强类型。

于 2012-10-10T23:49:05.767 回答