我有一个来自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的数据源传递?
答案 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());