Извлечение объекта DataTable Result из вложенного ответа JSON - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть json resposne из сети (restapi), в котором данные анализируются, преобразуются в json и отправляются как resposne с сервера.Мне нужно получить доступ и получить эти данные и данные и показать в виде сетки 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»в частности, в котором datatable определяется данными, полученными с сервера.

Поверьте мне, я исследовал проблему и тему здесь на stackoverflow и по сети, попробовал пару примеров с преобразованием напрямую json в datatable с помощью newtonsoft.json.Прочитайте много примеров о десериализации 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 и отправил с данными в ответ, который кажется стандартным способом преобразования данных, но не смог найти пример, объясняющий этот конкретный случай.

Как получить доступ к этому элементу - объект в json и parseэто правильно, чтобы иметь возможность позже преобразовать в datatable и передать в качестве источника данных для gridview?

1 Ответ

0 голосов
/ 19 сентября 2018

Мне удалось извлечь необходимые данные из ответа 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());
...