从嵌套的 JSON 响应中检索数据表结果对象



我有一个来自web(restapi(的json resposne,其中datatable被解析并转换为json,并从服务器作为resposne发送。我需要访问和检索该数据表和数据,并在wform网格视图中显示。我在从 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直接转换为datatable的示例。阅读了很多关于反序列化 JSON 的示例,创建将表示该元素 - 对象的必需类,但我仍然有问题,因为似乎在这个 json 响应中还有其他参数可以"解释"数据表项目、列和行及其特定属性和字段类型。

我试图解析 json 对象:

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

我可以看到其中的元素:

https://i.stack.imgur.com/tCKJh.png

似乎我仍然必须访问另一个级别才能从数据库附件元素获取数据或额外解析:

https://i.stack.imgur.com/rA1U1.png

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

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

我已经设法从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());

最新更新