Как читать разделы документа JSON? - PullRequest
0 голосов
/ 16 октября 2019

У меня есть документ JSON, и я хочу получить доступ к деталям раздела STATUS, но он продолжает возвращать ноль.

Данные JSON выглядят так:

{ 
   "results":[ 
      { 
         "messageId":"15712480583306574",
         "to":"",
         "from":"TestServer",
         "sentAt":"2019-10-16T17:47:38.368+0000",
         "doneAt":"2019-10-16T17:47:38.370+0000",
         "smsCount":1,
         "mccMnc":"null",
         "price":{ 
            "pricePerMessage":0.0,
            "currency":"USD"
         },
         "status":{ 
            "groupId":5,
            "groupName":"REJECTED",
            "id":8,
            "name":"REJECTED_PREFIX_MISSING",
            "description":"Number prefix missing"
         },
         "error":{ 
            "groupId":0,
            "groupName":"OK",
            "id":0,
            "name":"NO_ERROR",
            "description":"No Error",
            "permanent":false
         }
      }
   ]
}

Код C #:

string JsonData = response.Content.ToString();
dynamic results = JsonConvert.DeserializeObject<dynamic>(JsonData);
var statuses = results.status;
foreach(var stat in statuses) {
  string groupname = stat.groupName.Value;
  string name = stat.name.Value;
  string description = stat.description.Value;

}

По-прежнему возвращается ноль. Как я могу получить доступ к этим членам? Я использую Newtonsoft.

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Лучший вариант: создайте модель для JSON.

public class Price
{
    public double pricePerMessage { get; set; }
    public string currency { get; set; }
}

public class Status
{
    public int groupId { get; set; }
    public string groupName { get; set; }
    public int id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
}

public class Error
{
    public int groupId { get; set; }
    public string groupName { get; set; }
    public int id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public bool permanent { get; set; }
}

public class Result
{
    public string messageId { get; set; }
    public string to { get; set; }
    public string from { get; set; }
    public DateTime sentAt { get; set; }
    public DateTime doneAt { get; set; }
    public int smsCount { get; set; }
    public string mccMnc { get; set; }
    public Price price { get; set; }
    public Status status { get; set; }
    public Error error { get; set; }
}

public class RootObject
{
    public List<Result> results { get; set; }
}

Затем выполните RootObject results = JsonConvert.DeserializeObject<RootObject>(JsonData);

Справедливый вариант: получите точный JToken васхочу.

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {
        string jsonData = "{\"results\":[{\"messageId\":\"15712480583306574\",\"to\":\"\",\"from\":\"TestServer\",\"sentAt\":\"2019-10-16T17:47:38.368+0000\",\"doneAt\":\"2019-10-16T17:47:38.370+0000\",\"smsCount\":1,\"mccMnc\":\"null\",\"price\":{\"pricePerMessage\":0.0,\"currency\":\"USD\"},\"status\":{\"groupId\":5,\"groupName\":\"REJECTED\",\"id\":8,\"name\":\"REJECTED_PREFIX_MISSING\",\"description\":\"Number prefix missing\"},\"error\":{\"groupId\":0,\"groupName\":\"OK\",\"id\":0,\"name\":\"NO_ERROR\",\"description\":\"No Error\",\"permanent\":false}}]}";
        JObject jObject = JObject.Parse(jsonData);

        Console.WriteLine(jObject.SelectToken("results[0].status"));
    }
}
2 голосов
/ 16 октября 2019

Если вы хотите получить доступ к свойству объекта статуса, вам нужно переписать весь код.

string JsonData = response.Content.ToString();
var input = JObject.Parse(str);

var results = input["results"].Children();
var status = results.First()["status"];
string groupname = status["groupName"].ToString();
string name = status["name"].ToString();
string description = status["description"].ToString();

Console.WriteLine(groupname);
Console.WriteLine(name);
Console.WriteLine(description);

Результат в консоли

REJECTED

REJECTED_PREFIX_MISSING

Префикс номера отсутствует

Но япредпочел бы использовать конкретный класс. Вам нужно создать несколько классов. Здесь - хороший пример.

public class Envelope
{
    public List<Item> Results { get; set; }
}

public class Item
{
    public Status Status { get; set; }
}

public class Status
{
    public int GroupId { get; set; }
    public string GroupName { get; set; }
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

После этого использование становится намного проще.

string JsonData = response.Content.ToString();
MyEnvelope envelope = JsonConvert.DeserializeObject<MyEnvelope>(JsonData);
var status = envelope.results[0].status;
Console.WriteLine(status.GroupName);
Console.WriteLine(status.Name);
Console.WriteLine(status.Description);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...