JSON麻烦;反序列化为数据表

时间:2012-02-13 16:38:08

标签: c# .net json json.net

我正在尝试使用JSON.net将JSON加载到SQL数据库中。

我对其他JSON响应没有任何问题,但以下格式似乎没有正确反序列化。

    {"Report":["2012m01d01","2012m01d02","2012w01","2012m01","2012m01d03","2012m01d04","2012m01d05","2012m01d06","2012m01d07","2012m01d08"],
"Realtime":null}

有人可以提供一些有关为什么会这样做的见解吗?我正在使用以下代码进行反序列化。

public void Deserialize(String jsonText, ref DataTable dt)
        {
            JsonSerializer json = new JsonSerializer();
            json.NullValueHandling = NullValueHandling.Ignore;
            json.ObjectCreationHandling = ObjectCreationHandling.Replace;
            json.MissingMemberHandling = MissingMemberHandling.Ignore;
            json.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
            StringReader sr = new StringReader(jsonText);
            JsonTextReader reader = new JsonTextReader(sr);
            dt = (DataTable)json.Deserialize(reader, typeof(DataTable));

            reader.Close();
        }

有关解决此问题的最佳方法的任何想法是什么?这适用于其他JSON响应!

提前致谢

1 个答案:

答案 0 :(得分:0)

JSON能够保存hirarchial信息,这些信息不会转换为单个数据表,而是使用数据集和表关系转换为多个数据表。

我把你的json放在http://jsonlint.com验证器和格式化程序

你说这个反序列化没有问题

{
    "accountID": 1,
    "profileID": null,
    "name": "Pages",
    "ID": "18d039ae0360",
    "language": n‌​ull,
    "type": null,
    "Category": null,
    "IsHierarchy": false,
    "IntervalsEnabled": true,
    "IsRe‌​altimeCompatible": true,
    "properties": null
}

这是一个单一的对象

但这不会正确反序列化。

{
    "Report": [
        "2012m01d01",
        "2012m01d02",
        "2012w01",
        "2012m01",
        "2012m01d03",
        "2012m01d04",
        "2012m01d05",
        "2012m01d06",
        "2012m01d07",
        "2012m01d08"
    ],
    "Realtime": null
}

实际上你的问题是数据处理而非序列化

第一个是单个对象,可以反序列化为DataTable 另一个是保存对报表对象列表的引用的对象。

因此,您需要手动将对象的转换器写入两个dataTables

此代码有效,我相信您可以为两个表创建转换函数

           var settings = new JsonSerializerSettings
        {

            MissingMemberHandling = MissingMemberHandling.Error,
            NullValueHandling = NullValueHandling.Include

        };
        JsonSerializer json = JsonSerializer.Create(settings);

        json.Error += (x, y) =>
        {
            var s = y.ErrorContext;
            var t = y.CurrentObject;

        };

        StringReader sr = new StringReader(jsonString);
        JsonTextReader reader = new JsonTextReader(sr);


        var o = json.Deserialize<ClsReport>(reader);

        string sf = o.ReportItems[2];

希望这有帮助