【问题标题】:JSON trouble; deserialising to a datatableJSON麻烦;反序列化到数据表
【发布时间】:2012-02-13 16:38:08
【问题描述】:

我正在尝试使用 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 响应!

提前致谢

【问题讨论】:

  • “以下格式似乎没有正确反序列化”您是否收到任何错误或预期结果?什么错误,什么结果?你能举个例子吗?
  • 您是否使用 .NET 4.0 如果是的话,这里有一个链接也可以帮助您。drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/…
  • 不幸的是它不会产生任何错误。它似乎没有反序列化。以下反序列化很好。 [{"accountID":1,"profileID":null,"name":"Pages","ID":"18d039ae0360","language":null,"type":null,"Category":null,"IsHierarchy ":false,"IntervalsEnabled":true,"IsRealtimeCompatible":true,"properties":null},(等等)

标签: c# .net json json.net


【解决方案1】:

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

我将您的 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 另一个是包含对报表对象列表的引用的对象。

因此您需要手动将一个转换器从您的对象写入两个数据表

这段代码有效,我相信你可以为你的两个表创建一个转换函数

           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];

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2023-03-09
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多