如何使用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
包含多个值。当它以前只是一个像NOTES
这样的"string:string"时,这个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
)。
我也尝试过Dictionary<string, ICollection<Object>>
,Object
,甚至ICollection<Dictionary<string, Object>>
。
问题是我的控制器总是得到 EditorSubmitJoin,只有空值:
public void Put(EditorSubmissionJoined ajaxSubmission) {
// ajaxSubmission has only NULL values
}
尝试将"data"属性设置为公共,JSON 应该能够正确建模绑定。
有几种方法可以做到这一点。 一种方法是简单地使用JObject
并按名称访问字段,例如:jsonObject["data"]["ROTATION"]
。 您可以使用JObject.Parse
"反序列化"它,只需将 JSON 文本"解析"为JObject
即可。
或者,您可以编写自己的JsonConverter
并告诉 JSON.net 在反序列化特定类型时使用该转换器(例如 JsonConverterAttribute
)。 这需要在 ReadJson 覆盖中手动解析部分 JSON 文本,并且实际上取决于您所需的数据。
您还可以使用普雷斯顿评论的动态方法。
选择哪种方法取决于您希望事物的强类型。