【问题标题】:I am trying to deserialize JSON data to a dataset我正在尝试将 JSON 数据反序列化为数据集
【发布时间】:2016-10-28 21:46:05
【问题描述】:

我认为 JSON 应该易于使用。

我在 Visual Studio 2015 中有一个 C# .NET Windows 窗体程序,它被用作使用 Web API 2 远程服务器的客户端,RestSharp 作为 HTTP 客户端。

API 调用返回的数据为 Json 格式。但是,当我尝试使用以下语句将返回的 Json 反序列化为数据集时:

DataSet data = (DataSet)JsonConvert.DeserializeObject(response.Content, (typeof(DataSet)));,

我得到这个错误:

“读取数据表时出现意外的 JSON 令牌:EndArray”。

如果我使用“response.Content”中的文本并在此处验证它:http://www.jsonlint.com/#,结果显示“有效 JSON”。

当我使用调试器将“response.Content”查看为 Json 时,它会显示我正在寻找的正确记录。

我尝试过不同格式的JsonConvert,比如:

DataSet data = JsonConvert.DeserializeObject<DataSet>(response.Content);
DataTable datat = (DataTable)JsonConvert.DeserializeObject(response.Content, (typeof(DataTable)));

我也试过这个:

XmlDocument xd1 = new XmlDocument();
xd1 = (XmlDocument)JsonConvert.DeserializeXmlNode(response.Content, "RootObject");
DataSet dataset = new DataSet();
dataset.ReadXml(new XmlNodeReader(xd1));

我从这里得到的:http://www.c-sharpcorner.com/blogs/how-to-parse-json-string-to-dataset-in-c-sharp1

这似乎可以正常工作而不会出错,但数据集包含四个表(RootObject、data、CustomerRoles 和 ShoppingCartitems)。 我尝试删除三个表,但是有一些我不知道如何删除的约束和外键,并且在我删除约束之前它不允许我删除这些表。如果我尝试删除约束,则会出现此错误:“无法删除唯一约束 'Constraint1'。首先删除外键约束 'RootObject_data'。”

有人知道如何使用“易于使用”、“最流行”的 JSON 格式将我的 Json 数据反序列化为数据集并生成一个数据表吗?

JSON 数据

{
    "success": true,
    "data": [{
        "Id": 6,
        "CustomerGuid": "70b390d8-82d5-4bba-aa68-fc8268a1b1ff",
        "UserName": "victoria_victoria@nopCommerce.com",
        "Email": "victoria_victoria@nopCommerce.com",
        "CustomerRoles": [{
            "Id": 3,
            "Name": "Registered",
            "SystemName": "Registered"
        }],
        "AdminComment": null,
        "IsTaxExempt": false,
        "AffiliateId": 0,
        "VendorId": 0,
        "HasShoppingCartItems": false,
        "Active": false,
        "Deleted": false,
        "IsSystemAccount": false,
        "SystemName": null,
        "LastIpAddress": null,
        "CreatedOnUtc": "\/Date(1472933472393)\/",
        "LastLoginDateUtc": null,
        "LastActivityDateUtc": "\/Date(1472933472393)\/",
        "ExternalAuthenticationRecords": [],
        "ShoppingCartItems": []
    }, {
        "Id": 5,
        "CustomerGuid": "eb9e6f24-f362-4c10-942a-366e2919dc11",
        "UserName": "brenda_lindgren@nopCommerce.com",
        "Email": "brenda_lindgren@nopCommerce.com",
        "CustomerRoles": [{
            "Id": 3,
            "Name": "Registered",
            "SystemName": "Registered"
        }],
        "AdminComment": null,
        "IsTaxExempt": false,
        "AffiliateId": 0,
        "VendorId": 0,
        "HasShoppingCartItems": false,
        "Active": false,
        "Deleted": false,
        "IsSystemAccount": false,
        "SystemName": null,
        "LastIpAddress": null,
        "CreatedOnUtc": "\/Date(1472933472363)\/",
        "LastLoginDateUtc": null,
        "LastActivityDateUtc": "\/Date(1472933472363)\/",
        "ExternalAuthenticationRecords": [],
        "ShoppingCartItems": []
    }, {
        "Id": 4,
        "CustomerGuid": "9f46dbae-6942-410c-90b8-9b38a0890064",
        "UserName": "james_pan@nopCommerce.com",
        "Email": "james_pan@nopCommerce.com",
        "CustomerRoles": [{
            "Id": 3,
            "Name": "Registered",
            "SystemName": "Registered"
        }],
        "AdminComment": null,
        "IsTaxExempt": false,
        "AffiliateId": 0,
        "VendorId": 0,
        "HasShoppingCartItems": false,
        "Active": false,
        "Deleted": false,
        "IsSystemAccount": false,
        "SystemName": null,
        "LastIpAddress": null,
        "CreatedOnUtc": "\/Date(1472933472317)\/",
        "LastLoginDateUtc": null,
        "LastActivityDateUtc": "\/Date(1472933472317)\/",
        "ExternalAuthenticationRecords": [],
        "ShoppingCartItems": []
    }, {
        "Id": 3,
        "CustomerGuid": "6277386b-13ee-427b-9cfe-4ebfa487c340",
        "UserName": "arthur_holmes@nopCommerce.com",
        "Email": "arthur_holmes@nopCommerce.com",
        "CustomerRoles": [{
            "Id": 3,
            "Name": "Registered",
            "SystemName": "Registered"
        }],
        "AdminComment": null,
        "IsTaxExempt": false,
        "AffiliateId": 0,
        "VendorId": 0,
        "HasShoppingCartItems": false,
        "Active": false,
        "Deleted": false,
        "IsSystemAccount": false,
        "SystemName": null,
        "LastIpAddress": null,
        "CreatedOnUtc": "\/Date(1472933472253)\/",
        "LastLoginDateUtc": null,
        "LastActivityDateUtc": "\/Date(1472933472253)\/",
        "ExternalAuthenticationRecords": [],
        "ShoppingCartItems": []
    }, {
        "Id": 2,
        "CustomerGuid": "241f45f1-b38c-4e22-8c5a-743fa3276620",
        "UserName": "steve_gates@nopCommerce.com",
        "Email": "steve_gates@nopCommerce.com",
        "CustomerRoles": [{
            "Id": 3,
            "Name": "Registered",
            "SystemName": "Registered"
        }],
        "AdminComment": null,
        "IsTaxExempt": false,
        "AffiliateId": 0,
        "VendorId": 0,
        "HasShoppingCartItems": false,
        "Active": false,
        "Deleted": false,
        "IsSystemAccount": false,
        "SystemName": null,
        "LastIpAddress": null,
        "CreatedOnUtc": "\/Date(1472933472207)\/",
        "LastLoginDateUtc": null,
        "LastActivityDateUtc": "\/Date(1472933472207)\/",
        "ExternalAuthenticationRecords": [],
        "ShoppingCartItems": []
    }, {
        "Id": 1,
        "CustomerGuid": "a940dc03-5f52-47d2-9391-8597b3b31cf2",
        "UserName": "tony@lakesideos.com",
        "Email": "tony@lakesideos.com",
        "CustomerRoles": [{
            "Id": 1,
            "Name": "Administrators",
            "SystemName": "Administrators"
        }, {
            "Id": 2,
            "Name": "Forum Moderators",
            "SystemName": "ForumModerators"
        }, {
            "Id": 3,
            "Name": "Registered",
            "SystemName": "Registered"
        }],
        "AdminComment": null,
        "IsTaxExempt": false,
        "AffiliateId": 0,
        "VendorId": 0,
        "HasShoppingCartItems": true,
        "Active": true,
        "Deleted": false,
        "IsSystemAccount": false,
        "SystemName": null,
        "LastIpAddress": "71.185.255.7",
        "CreatedOnUtc": "\/Date(1472933470783)\/",
        "LastLoginDateUtc": "\/Date(1477522483903)\/",
        "LastActivityDateUtc": "\/Date(1477523996553)\/",
        "ExternalAuthenticationRecords": [],
        "ShoppingCartItems": [{
            "Id": 1,
            "StoreId": 1,
            "ShoppingCartTypeId": 1,
            "CustomerId": 1,
            "ProductId": 18,
            "AttributesXml": null,
            "CustomerEnteredPrice": 0.0000,
            "Quantity": 1,
            "CreatedOnUtc": "\/Date(1473801903447)\/",
            "UpdatedOnUtc": "\/Date(1473803336207)\/",
            "IsFreeShipping": false,
            "IsShipEnabled": true,
            "AdditionalShippingCharge": 0.0000,
            "IsTaxExempt": false
        }]
    }]
}

【问题讨论】:

  • 您的数据没有“最流行”的格式。 “意外的 JSON 令牌”表示您使用的解析器未预期“EndArray”或] 字符
  • 粘贴 JSON 数据,也许有人可以帮助你。
  • @cricket_007 很抱歉,但当我来到这里时:newtonsoft.com/json,他们声称他们是最受欢迎的 .NET 库。
  • 库 != 格式。
  • cricket_007 我明白你在说什么。谢谢,托尼

标签: c# json json.net restsharp


【解决方案1】:

这里简要概述了您需要执行的操作。

取自NewtonSoft - Deserialize Object的例子

您的数据片段

{
    "Id": 1,
    "CustomerGuid": "a940dc03-5f52-47d2-9391-8597b3b31cf2",
    "UserName": "tony@lakesideos.com",
    "Email": "tony@lakesideos.com"

这是一个Customer 对象。它需要它自己的 C# 模型类。

public class Customer {

    int id;
    string guid;
    string username;
    string email;
    // etc...

    // getters and setters...
}

这存储在data的列表中

"data": [ { ... }, { ... } ]

您需要另一个对象来保存这些对象的列表以及一个布尔值success。让我们称之为Response

{
    "success": true,
    "data": [{

该类以

开头
public class Response {

    bool success;
    IList<Customer> data;

然后,您需要其他列表和对象类来完成类似的操作

"CustomerRoles": [{
        "Id": 3,
        "Name": "Registered",
        "SystemName": "Registered"
    }],

一旦你对整个类域建模,你应该能够拥有

Response res = JsonConvert.DeserializeObject<Response>(json);

由于您似乎已经尝试过,并且收到关于 END_ARRAY 字符的错误,因此您的 DataSet 类中的某些内容未正确映射到列表

然后让res.data 访问数据列表,然后您可以遍历那些Customer 对象来构建您的数据集/表对象,我假设在某些GUI 列表中显示您的数据

【讨论】:

  • 您可以轻松地在 json2csharp.com 中建模您的类,复制并粘贴您的 json 文件内容,您将获得 c# 类
  • 谢谢@mcNets 我知道有一个类似Java的网站
  • 我在我的 Web 服务中使用 xml 文件,然后将此文件转换为数据集,xml 到数据集将外键添加到 dataset.tables,但我不确定如果你定义你的会发生什么拥有自己的数据集(使用数据集编辑器),然后使用此数据集 ReadXml。
  • 感谢大家的帮助,但这样做似乎比我在这里看到的要复杂得多,工作量也大得多:link。有没有人完成该链接中显示的内容?谢谢,托尼
  • @mcNets :-|我的意思是你做了一个 MVVM 双关语......当你将 JSON 转换为业务对象时,它们被称为模型
【解决方案2】:

尝试从 Response.Data 而不是 Response.Content 开始,这将使您进入一层以公开实际数据以进行反序列化。
例如:

var response = _requestProcessor.Process<Request, Response>(
                new Request(id)).dataList;

return new JsonNetResult() { Data = response, JsonRequestBehavior= JsonRequestBehavior.AllowGet };

无论请求对象是什么,它都有一个保存响应数据的对象;这是要反序列化的实际项目。

也许您需要做的是 Cricket_007 建议的,并创建一个类来封装 JSON 中返回的 Success 对象,然后反序列化为一个 Success 对象和一个 Data 对象,这是您正在尝试的对象的列表到达,得到。 您需要遵循的步骤是:

  1. 将整个 JSON 字符串转换为一个对象,该对象包含两个对象,即 Success 和 Data。 JSONObject content = new JSONObject(Response.Content); 也许,这是未经测试的。

  2. 从该对象中,仅反序列化其中的 Data 对象。

    content.data -或- content["data"]

或者一些这样的东西应该可以让你找到你想要使用的部分。

【讨论】:

  • Brinky,没有 Response.Data。也许我不理解你,但我没有看到请求对象中的哪里有响应的数据。谢谢。
  • 您的 Response.Content 对象封装了您正在调用的服务的整个响应。您要做的是进一步细化 Response,Content 的部分到 data: object inside,然后反序列化该部分。那是您使用的相关部分。或许将返回的整个 JSON 字符串转换为 JSONObject:
  • Brinky,如果我理解正确的话,听起来我只需要从 response.Content 字符串中创建一个子字符串,并且该子字符串应该包含我想要反序列化为数据集的数据。我基本上会删除如下所示的 Json 数据部分:“”成功“:真”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多