У меня есть эта строка 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);
}
это действительно не нужно для таких небольших данных, string name = jobject["name"]; было достаточно
Хотя есть много преимуществ. Проверка типов во время компиляции очевидна. Однако есть и менее осязаемые, например читабельность кода.
@fasola дело не в многословии метода, а в правильном способе его обработки. Вот почему я удалил свой ответ и проголосовал за Давида.
Следует также отметить, что десериализация в конкретный класс почти в два раза быстрее, чем использование JObject.





Чтобы получить имя, используйте это
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 OP специально нуждается в свойстве Name, так что это не проблема.
Согласен - просто делаю незначительный вывод. Я согласен с тем, что это лучший подход... как с точки зрения ремонтопригодности, так и с точки зрения производительности. Я столкнулся с грязными данными о больших строках json, не зная источника. Очень неудовлетворительно :-(
Один из способов обхода, чтобы не знать, существует ли свойство или нет, — это пакет-оболочка json с метаданными { "type" : "myType1", "Payload" : "{ inner json payload}" } Это, конечно, предполагает, что вы контролируете вызывающую сторону.
Использование ["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();
}
}
Разберите его на правильный класс C# вместо
JObject, это избавит вас от всех этих сложностей.