在收到的JSON中,如下所示:
{ name { first_name: 'Foo', last_name: 'Bar' }, emails: [ {value: 'foo@bar.com' } ]
例如,有没有一种方法可以告诉JsonConvert:
将value
数组的第一个元素的emails
属性提取到下面的POCO属性Email
中吗?
从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;
};
我只是想知道是否已经有内置的基于属性的语法来做到这一点。
答案 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;}
}