Укажите местоположение объекта в графе объектов JSON в JsonConvert

#c# #.net #json.net

#c# #.net #json.net

Вопрос:

В JSON, полученном следующим образом:

 { name { first_name: 'Foo', last_name: 'Bar' }, emails: [ {value: 'foo@bar.com' } ]
  

Есть ли способ сообщить JsonConvert, например:

  1. Извлеките value свойство первого элемента emails массива в свойство POCO Email ниже?

  2. Прочитать 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 нет, не отмечайте это как ответ, если это не то, на что указывает вопрос.