【问题标题】:Retrieve DataTable Result object from Nested JSON response从嵌套 JSON 响应中检索 DataTable Result 对象
【发布时间】:2019-02-17 00:39:11
【问题描述】:

我有一个来自 web (restapi) 的 json 响应,其中数据表被解析并转换为 json 并作为响应从服务器发送。我需要访问和检索该数据表和数据并在 winform 网格视图中显示。我在从 json 响应中正确访问和反序列化此元素时遇到问题。

这里是一个json响应的例子:

{
  "api_version": "1.07",
  "app_option": "KOM_KOMITENTI",
  "checksum": "FE1A57ACCBD1EBF981B80344B88AE80B",
  "data": "{\"databaseattachment\": \"{\\\"count\\\": 1,\\\"_class_name\\\": \\\"Tapidatabaseattachment\\\",\\\"items\\\": [{\\\"fields\\\": {\\\"count\\\": 10,\\\"_class_name\\\": \\\"Tapitablefields\\\",\\\"items\\\": [{\\\"name\\\": \\\"sif_firme\\\",\\\"type\\\": \\\"C\\\"},{\\\"name\\\": \\\"naziv\\\",\\\"type\\\": \\\"C\\\"},{\\\"name\\\": \\\"jmbg\\\",\\\"type\\\": \\\"C\\\"},{\\\"name\\\": \\\"adresa\\\",\\\"type\\\": \\\"C\\\"},{\\\"name\\\": \\\"mesto\\\",\\\"type\\\": \\\"C\\\"},{\\\"name\\\": \\\"tip_firme\\\",\\\"type\\\": \\\"C\\\"},{\\\"name\\\": \\\"racun\\\",\\\"type\\\": \\\"C\\\"},{\\\"name\\\": \\\"mat_broj\\\",\\\"type\\\": \\\"C\\\"},{\\\"name\\\": \\\"clanova\\\",\\\"type\\\": \\\"N\\\"},{\\\"name\\\": \\\"saldo\\\",\\\"type\\\": \\\"N\\\"}]},\\\"rows\\\": {\\\"count\\\": 9600,\\\"_class_name\\\": \\\"Tapitablerows\\\",\\\"items\\\": [{\\\"sif_firme\\\": \\\"900010\\\",\\\"naziv\\\": \\\"Janošević Jasminka\\\",\\\"adresa\\\": \\\"Milinka Kušića 1\\\",\\\"mesto\\\": \\\"Ivanjica\\\",\\\"tip_firme\\\": \\\"01\\\",},{\\\"sif_firme\\\": \\\"900020\\\",\\\"naziv\\\": \\\"Obrenović Dušan\\\",\\\"adresa\\\": \\\"Milinka Kušića 1\\\",\\\"mesto\\\": \\\"Ivanjica\\\",\\\"tip_firme\\\": \\\"01\\\",},{\\\"sif_firme\\\": \\\"900030\\\",\\\"naziv\\\": \\\"Ristić Danijela\\\",\\\"adresa\\\": \\\"Milinka Kušića 3\\\",\\\"mesto\\\": \\\"Ivanjica\\\",\\\"tip_firme\\\": \\\"01\\\",\\\"clanova\\\": 2,\\\"saldo\\\": 31932.7},{\\\"sif_firme\\\": \\\"900040\\\",\\\"naziv\\\": \\\"Ristić Ratomir\\\",\\\"adresa\\\": \\\"Milinka Kušića 3\\\",\\\"mesto\\\": \\\"Ivanjica\\\",\\\"tip_firme\\\": \\\"01\\\",},\\\"table_name\\\": \\\"listakupaca\\\"}]}\\r\\n\",\"database_format\": \"PLAIN_OBJ\",\"error_state\": \"ok\",\"exec_date_time\": \"2018-09-11T11:49:58+02:00\",\"paging_page_len\": 9600,\"paging_rec_count\": 9600,\"paging_selected_page\": 1,\"status\": \"Ok\",\"_class_name\": \"Tapikom_komitentiresult\"}",
  "disk": "d:\\DISK\\P",
  "encoding": "PLAIN",
  "error_state": "ok",
  "instance_id": "743edba3f9f123b",
  "job": "kom",
  "poslovna_godina": 2018,
  "pozicija": "01",
  "referent": "0002",
  "req_id": "DOTEST_4S60QRPEI",
  "result_error_state": "ok",
  "session_id": "53744862e8cc84e7",
  "sif_firme": "0000",
  "_class_name": "Tapiresponseenvelope"
}

我需要访问“data”元素和“databaseattachment”,特别是其中的数据表是使用从服务器检索的数据定义的。

相信我,我已经在 stackoverflow 和网络上研究了问题和主题,并尝试了几个使用 newtonsoft.json 将 json 直接转换为数据表的示例。阅读很多关于反序列化 JSON 的示例,创建将代表该元素 - 对象的所需类,但我仍然有问题,因为在这个 json 响应中似乎有额外的参数可以“解释”数据表项、列和行及其特定属性和字段类型。

我尝试解析 json 对象:

string mResponseString = Encoding.Default.GetString(mResponse);
JObject jsonResponse = JObject.Parse(mResponseString);

我可以看到里面的元素:

https://i.imgur.com/OHOQifl.png

看来我仍然需要访问一个级别才能从数据库附件元素中获取数据或额外解析:

https://i.imgur.com/zB22P6U.png

在我看来,这是某种数据表模板,它在 json 中解析并与数据一起发送作为响应,这似乎是转换数据的标准方式,但找不到解释这种特定情况的示例。

我如何访问这个元素 - json 中的对象并正确解析它以便以后能够转换为数据表并作为 gridview 的数据源传递?

【问题讨论】:

  • 我检查了你的 JSON,看起来 JSON 中有错误。它没有很好地形成。我建议您仔细手动验证。
  • 你试过jsonResponse.data.databaseattachment吗?
  • 您需要更新数据字段的 json 字符串。数据字段还包含一个子 json 字符串。因此,您需要为此创建一个模型并反序列化更新字符串。
  • @TiberSeptim 感谢您的反馈,它的格式不正确可能是因为我手动截断了此示例的数据结果,因为有很多记录。阿伦,你能告诉我更多你的意思吗?我已经尝试过了,但似乎这些元素不能像那个符号那样被识别。我无法输入,因为 jsonResposne 直到运行时才知道响应元素。

标签: c# json datatable dataset


【解决方案1】:

我已经设法从 json 响应中提取所需的数据。对于可能有类似问题的人来说,想法可能是有用的答案。问题是返回的数据深深嵌套在“数据”元素中,它被解析为 json 对象,但在该对象内部,它可以是一个 json 数组,而不是另一组 json 对象和 json 数组。

也许我的解决方案不是最好的,而且有点尴尬,但我最终做到了。必须经过几次迭代才能获得具有数据表数据的所需元素。

string mResponseString = Encoding.UTF8.GetString(mResponse);

JObject jsonResponse = JObject.Parse(mResponseString);
string data = (string)jsonResponse["data"];

JObject jsonData = JObject.Parse(data);
string databaseattachment = (string)jsonData["databaseattachment"];

JObject jsonDataAttachment = JObject.Parse(databaseattachment);
JArray jaDAItems = (JArray)jsonDataAttachment["items"];
string rows = jaDAItems.First["rows"].ToString();

JObject jaDAItemsRows = JObject.Parse(rows);
JArray jaDARowsItems = (JArray)jaDAItemsRows["items"];

DataTable dt = JsonConvert.DeserializeObject<DataTable>(jaDARowsItems.ToString());

【讨论】:

    猜你喜欢
    • 2015-01-19
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多