如何反序列化此JSON?

时间:2012-10-10 23:00:35

标签: c# asp.net-mvc-4 asp.net-web-api json.net

如何使用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中的值表示列并且可以更改,因此我无法使用例如json.net deserialize string to nested class中名为“NOTES”的字符串。

注意EQUIPMENT包含多个值。如果它之前只是一个“字符串:字符串”,如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可以在data中包含KeyValuePair(如NOTES)或字典(如EQUIPMENT)。< / p>

我也尝试了Dictionary<string, ICollection<Object>>Object,甚至ICollection<Dictionary<string, Object>>

问题是我的控制器始终获取的EditorSubmissionJoined只包含空值:

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

2 个答案:

答案 0 :(得分:2)

尝试将'data'属性设置为public,您的JSON应该能够正确建模绑定。

答案 1 :(得分:1)

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

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

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

您选择哪种方法取决于您希望事物的强度类型。

相关问题