C#Newtonsoft.JSON内部对象映射
我最近遇到了一个问题,我的json格式仅为1层,但为了重用我的模型,我希望按照下面给出的示例对它们进行格式化 当然,我可以在构造函数中转储json并自己格式化它,但我希望我的模型更抽象一点C#Newtonsoft.JSON内部对象映射,c#,json.net,C#,Json.net,我最近遇到了一个问题,我的json格式仅为1层,但为了重用我的模型,我希望按照下面给出的示例对它们进行格式化 当然,我可以在构造函数中转储json并自己格式化它,但我希望我的模型更抽象一点 using System; using Newtonsoft.Json; using Newtonsoft.Json.Linq; public class Program { public static void Main() { string json = @"
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class Program
{
public static void Main()
{
string json = @"
{
""Name"" : ""Blaa"",
""Age"" : 1,
""EyeColor"": ""Blue""
}";
JObject jsonObj = JObject.Parse(json);
Person person = jsonObj.ToObject<Person>();
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
Console.WriteLine(person.Eyes.Color);
}
}
class Person
{
[JsonProperty("Name")]
public string Name { get; set; }
[JsonProperty("Age")]
public int Age { get; set; }
public Eyes Eyes{ get; set; }
}
class Eyes
{
[JsonProperty("EyeColor")]
public string Color{ get; set; }
}
使用系统;
使用Newtonsoft.Json;
使用Newtonsoft.Json.Linq;
公共课程
{
公共静态void Main()
{
字符串json=@”
{
“名称”:“Blaa”,
“年龄”:1,
“眼睛颜色”:“蓝色”
}";
JObject jsonObj=JObject.Parse(json);
Person=jsonObj.ToObject();
Console.WriteLine(person.Name);
控制台写入线(人、年龄);
控制台。书写线(人。眼睛。颜色);
}
}
班主任
{
[JsonProperty(“名称”)]
公共字符串名称{get;set;}
[JsonProperty(“年龄”)]
公共整数{get;set;}
公众的眼睛{get;set;}
}
班眼
{
[JsonProperty(“EyeColor”)]
公共字符串颜色{get;set;}
}
如果您想将数据传输对象与域模型分离,这可能会很有用
虽然可以单独在DTO中解决这一问题,但它所需的定制不允许轻松重用,也不允许从示例JSON生成DTO
您希望DTO与JSON保持匹配:
public class PersonDto
{
public string Name { get; set; }
public int Age { get; set; }
public string EyeColor { get; set; }
}
然后将其映射到域模型中:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Eyes Eyes { get; set; }
// Empty ctor for various reasons
public Person() { }
public Person(PersonDto dto)
: this()
{
Name = dto.Name;
Age = dto.Age;
Eyes = new Eyes
{
Color = dto.EyeColor
};
}
}
public class Eyes
{
public string Color{ get; set; }
}
例如,映射也可以使用AutoMapper完成
或者,您可以通过忽略但返回或删除Eyes实例的属性来解决此问题:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
[JsonIgnore]
public Eyes Eyes { get; set; }
public string EyeColor
{
get { return Eyes.Color; }
set { Eyes.Color = value; }
}
public Person()
{
this.Eyes = new Eyes();
}
}
注意,我省略了JsonProperty属性,如果属性名与JSON字段名匹配,则不需要这些属性。我想我应该决定使用DTO或域模型。谢谢你的时间。