从嵌套的JSON响应中检索DataTable Result对象

时间:2018-09-12 11:25:00

标签: c# json datatable dataset

我有一个来自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"
}

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

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

我试图解析json对象:

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

我可以看到其中的元素:

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

似乎我仍然必须再访问一个级别,才能从databaseattachment元素获取数据或解析附加内容:

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

在我看来,这是一种数据表模板,该模板在json中进行解析并随数据一起发送以作为响应,这似乎是转换数据的标准方式,但找不到解释此特定情况的示例。 / p>

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

1 个答案:

答案 0 :(得分:0)

我设法从json响应中提取了所需的数据。思想对于可能遇到类似问题的人可能是有用的答案。问题在于返回的数据深深地嵌套在“ data”元素中,并且被解析为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());