Как получить элемент в строке JSON

У меня есть эта строка JSON с именем правопреемник:

{
    "id": 15247055788906,
    "gid": "15247055788906",
    "name": "Bo Sundahl",
    "resource_type": "user"
}

Я хочу получить элемент «имя» и его значение, если оно не равно нулю. я пытался

var jobject = JsonConvert.DeserializeObject<JObject>(assignee);

И

var jo = JObject.Parse(assignee);

Я пытался пройти через него, но я просто получаю нулевое исключение или пустой вывод, даже если я просто печатаю саму переменную уполномоченного, заполненную данными.

Мой цикл выглядит так:

foreach (var result in jobject["name"])
{
    Debug.WriteLine(result);
}

Разберите его на правильный класс C# вместо JObject, это избавит вас от всех этих сложностей.

DavidG 01.03.2019 13:58

это действительно не нужно для таких небольших данных, string name = jobject["name"]; было достаточно

user11110869 01.03.2019 14:03

Хотя есть много преимуществ. Проверка типов во время компиляции очевидна. Однако есть и менее осязаемые, например читабельность кода.

DavidG 01.03.2019 14:04

@fasola дело не в многословии метода, а в правильном способе его обработки. Вот почему я удалил свой ответ и проголосовал за Давида.

Anthony Russell 01.03.2019 14:04

Следует также отметить, что десериализация в конкретный класс почти в два раза быстрее, чем использование JObject.

DavidG 01.03.2019 14:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
101
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Чтобы получить имя, используйте это

string name = jobject["name"];

Самый простой и лучший способ — десериализовать в класс C#, например:

public class Data
{
    public long Id { get; set; }
    public string Name { get; set; }
    //etc..
}

И десериализовать так

var data = JsonConvert.DeserializeObject<Data>(json);
var name = data.Name;

Проголосовал... но, если входящие данные "грязные" и вы не знаете всех форм, этот подход может быть проблематичным.

Clay 01.03.2019 14:19

@Clay OP специально нуждается в свойстве Name, так что это не проблема.

DavidG 01.03.2019 14:20

Согласен - просто делаю незначительный вывод. Я согласен с тем, что это лучший подход... как с точки зрения ремонтопригодности, так и с точки зрения производительности. Я столкнулся с грязными данными о больших строках json, не зная источника. Очень неудовлетворительно :-(

Clay 01.03.2019 14:25

Один из способов обхода, чтобы не знать, существует ли свойство или нет, — это пакет-оболочка json с метаданными { "type" : "myType1", "Payload" : "{ inner json payload}" } Это, конечно, предполагает, что вы контролируете вызывающую сторону.

Anthony Russell 01.03.2019 16:42

Использование ["name"] возвращает JToken, оно равно null, если свойство не существует

JToken token = jo["name"];
Debug.WriteLine(token?.ToString() ?? "<default value>");

Если вы заранее не знаете свойства, вы можете пройтись по свойствам JObject и получить пары "имя-значение" следующим образом:

var jsonObject = JObject.Parse(str);
foreach (var item in jsonObject)
{
   var name = item.Key;
   JToken token = item.Value;
   if (token is JValue)
   {
      var value = token.Value<string>();
   }
}

Вот как это должно работать:

class Data
  {
    public long? Id { get; set; }
    public string Gid { get; set; }
    public string Name { get; set; }
    public string Resource_Type { get; set; }
  }
  class Program
  {
    static void Main(string[] args)
    {

      string assignee = "{\"id\": 15247055788906, \"gid\": \"15247055788906\", \"name\": \"Bo Sundahl\", \"resource_type\": \"user\"}";
      Data data = JsonConvert.DeserializeObject<Data>(assignee);
      Console.WriteLine(data.Id);
      Console.WriteLine(data.Gid);
      Console.WriteLine(data.Name);
      Console.WriteLine(data.Resource_Type);
      Console.ReadLine();
    }
  }

Другие вопросы по теме