如何使用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
}
答案 0 :(得分:2)
尝试将'data'属性设置为public,您的JSON应该能够正确建模绑定。
答案 1 :(得分:1)
有几种方法可以做到。一种方法是简单地使用JObject
并按名称访问字段,例如:jsonObject["data"]["ROTATION"]
。您可以使用JObject.Parse
对其进行“反序列化”,只需将JSON文本“解析”为JObject
。
或者,您可以编写自己的JsonConverter
并告诉JSON.net在反序列化特定类型时使用该转换器(例如JsonConverterAttribute
)。这需要在ReadJson覆盖中手动解析部分JSON文本,并且实际上取决于您期望的数据。
您也可以使用Preston评论过的动态方法。
您选择哪种方法取决于您希望事物的强度类型。