Я не хочу создавать класс для десериализации ответа, поскольку в будущем он может измениться.
Я пытался несколькими способами получить доступ к нужным мне данным, но я действительно не знаю, как получить доступ к элементам в ответе json.
obj {{
"type": "regular",
"response": {
"usable": [
{
"id": "897",
"name": "John Doe",
"owner": {
"id": "2",
"username": "jdoe",
"firstname": "john",
"lastname": "doe"
}
},
{
"id": "657",
"name": "Karen Whiner",
"owner": {
"id": "3",
"username": "kwhiner",
"firstname": "karen",
"lastname": "whiner"
}
},
},
"error_code": 0,
"error_msg": "",
"warnings": [],
"timestamp": 74772822
}}
Что мне нужно:
Консоль.WriteLine:
id: 897 - имя: john doe - имя пользователя: jdoe
id: 657 - имя: Karen Whiner - имя пользователя: kwhiner
. и т. д.
Что я пробовал:
var jsonString = await result.Content.ReadAsStringAsync();
var obj = JsonConvert.DeserializeObject<object>(jsonString);
DataSet dataSet = JsonConvert.DeserializeObject<DataSet>(jsonString);
DataTable dataTable = dataSet.Tables["response"];
foreach (DataRow row in dataTable.Rows)
{
Console.WriteLine(row["id"] + " - " + row["name"]);
}
---
JObject stuff = JObject.Parse(jsonString);
foreach (JProperty rate in stuff)
{
Console.WriteLine(rate.Name + ": " + rate.Value);
}
какие-либо предложения?
Спасибо
Во-первых, опубликованный вами json неверен ... но я предполагаю, что он как-то связан с копированием/вставкой и бревиатурой.
У вас есть разные варианты, но если вы хотите использовать динамическую/объектную десериализацию, вы можете сделать это, чтобы напечатать одну из строк.
var obj = JsonConvert.DeserializeObject<dynamic>(text);
var usableList = obj["response"]["usable"];
Console.WriteLine($"id: {usableList[0]["id"]} - name: {usableList[0]["name"]} - username: {usableList[0]["owner"]["username"]}");
//prints
id: 897 - name: John Doe - username: jdoe
Я бы порекомендовал создать класс для десериализации вашего json. таким образом, вы можете использовать Linq и циклы for для просмотра всего вашего используемого списка.
public class Rootobject
{
public string type { get; set; }
public Response response { get; set; }
public int error_code { get; set; }
public string error_msg { get; set; }
public object[] warnings { get; set; }
public int timestamp { get; set; }
}
public class Response
{
public Usable[] usable { get; set; }
}
public class Usable
{
public string id { get; set; }
public string name { get; set; }
public Owner owner { get; set; }
}
public class Owner
{
public string id { get; set; }
public string username { get; set; }
public string firstname { get; set; }
public string lastname { get; set; }
}
// and deserialization and printing would be like this,
var obj = JsonConvert.DeserializeObject<Rootobject>(text);
foreach (var item in obj.response.usable)
{
Console.WriteLine($"id: {item.id} - name: {item.name} - userid: {item.owner.username}");
}
// prints:
id: 897 - name: John Doe - userid: jdoe
id: 657 - name: Karen Whiner - userid: kwhiner
если вы используете foreach(var i in usableList)
.. тогда вы должны использовать переменную i
в Console.WriteLine
. Console.WriteLine($"id: {i["id"]}")
. Также. вы должны использовать $ для интерполяции строк. Пример, который я написал, перебирает все используемые и распечатывает, как я показал.
спасибо, я проверил, и по какой-то причине он печатает только первую строку, я пытался пройти через нее с помощью foreach (var i в usableList), затем Console.WriteLine("id: {usableList[0]["id "]}); но я не получаю информацию о данных, как я могу перебирать каждую строку/значение?