如何反序列化此 JSON



如何使用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 文本,并且实际上取决于您所需的数据。

您还可以使用普雷斯顿评论的动态方法。

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

相关内容

  • 没有找到相关文章

最新更新