#c# #.net #json.net
#c# #.net #json.net
Вопрос:
В JSON, полученном следующим образом:
{ name { first_name: 'Foo', last_name: 'Bar' }, emails: [ {value: 'foo@bar.com' } ]
Есть ли способ сообщить JsonConvert, например:
-
Извлеките
value
свойство первого элементаemails
массива в свойство POCOEmail
ниже? -
Прочитать
first_name
свойство изname
объекта в JSON и поместить его вFirstName
свойство POCO ниже?
Я пытался выполнить такой путь, но это не сработало. Есть ли синтаксис для этого?
public class DaPOCO
{
[JsonProperty("name.first_name")]
public FirstName { get; set; }
[JsonProperty("emails[0].value")]
public Email { get; set;}
}
Я знаю, что из-за отсутствия синтаксиса я мог бы сам прочитать свойства из динамического объекта следующим образом:
dynamic data = JsonConvert.DeseralizeObject(json);
DaPOCO poco = new DaPOCO
{
FirstName = data.name.first_name;
Email = data.emails?.ElementAt(0)?.value;
};
Мне просто интересно, существует ли встроенный синтаксис на основе атрибутов для этого.
Ответ №1:
Согласно вашему опубликованному сериализованному json, ниже должны быть правильные модели для десериализации. Я полагаю, вы понимаете, что текущая модель несовместима с имеющимся у вас json
public class Name
{
public string first_name { get; set; }
public string last_name { get; set; }
}
public class Email
{
public string value { get; set; }
}
public class DaPOCO
{
public Name name { get; set; }
public List<Email> emails { get; set; }
}
Вы можете попробовать что-то вроде приведенного ниже
using System;
using System.Linq;
using Newtonsoft.Json.Linq;
public class Program
{
public static void Main()
{
string responseString = @"{ name: { first_name: 'Foo', last_name: 'Bar' }, emails: [ {value: 'foo@bar.com' } ] }";
JObject jo = JObject.Parse(responseString);
JObject obj = (jo["emails"] as JArray).FirstOrDefault(x => !string.IsNullOrEmpty(x.Value<string>("value"))) as JObject;
DaPOCO poco = new DaPOCO
{
FirstName = ((jo["name"] as JObject)["first_name"]).ToString(),
Email = obj["value"].ToString(),
};
Console.WriteLine(poco.FirstName "t" poco.Email);
}
}
public class DaPOCO
{
public string FirstName { get; set; }
public string Email { get; set;}
}
Комментарии:
1. Да, конечно. Но мне было интересно, есть ли способ указать путь, подобный синтаксису, к десериализатору newtonsoft?
2. Ну, не совсем то, о чем я спрашиваю, но поскольку вы прилагаете столько усилий, я буду отмечать этот ответ как правильный, пока кто-нибудь не попадет в цель в упор. На самом деле мой вопрос не в том, что мне теперь делать? Как мне приступить к десериализации объекта.
3. @WaterCoolerv2 нет, не отмечайте это как ответ, если это не то, на что указывает вопрос.