C#Newtonsoft.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 = @"

我最近遇到了一个问题,我的json格式仅为1层,但为了重用我的模型,我希望按照下面给出的示例对它们进行格式化

当然,我可以在构造函数中转储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或域模型。谢谢你的时间。