在JSON对象图中将对象位置指定为JsonConvert

时间:2019-04-21 14:18:57

标签: c# .net json.net

在收到的JSON中,如下所示:

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

例如,有没有一种方法可以告诉JsonConvert:

  1. value数组的第一个元素的emails属性提取到下面的POCO属性Email中吗?

  2. 从JSON中的first_name对象中读取name属性并将其放在下面的POCO的FirstName属性中吗?

我已经尝试过这种路径,但这行不通。有语法吗?

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 个答案:

答案 0 :(得分:0)

根据您发布的序列化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;} 
}