【问题标题】:Problem with DataMemeber attribute if change the name of field .NET如果更改字段 .NET 的名称,DataMemeber 属性会出现问题
【发布时间】:2019-02-01 10:58:31
【问题描述】:

我用我的控制器使用restsharp(一个web api,.NET web应用程序项目)调用这个https://jsonplaceholder.typicode.com/albums。 这是我的课,我使用 Datacontracts 和 DataMemebers。

[DataContract]
public class Album
{
    [DataMember(Name = "userId")]
    public int UserId { get; set; }

    [DataMember(Name = "id")]
    public int Id { get; set; }

    [DataMember(Name = "title")]
    public string Title { get; set; }

}

使用邮递员的结果是:

 {
    "userId": 1,
    "id": 1,
    "title": "quidem molestiae enim"
    }

我设置了正确的参考,它工作正常。

但是当我用其他名称更改字段名称时,例如

[DataContract]
    public class Album
    {
        [DataMember(Name = "userId")]
        public int myproject { get; set; }

        [DataMember(Name = "id")]
        public int code { get; set; }

        [DataMember(Name = "title")]
        public string name { get; set; }

    }

并使用邮递员,结果是

{
    "userId": 0,
    "id": 0,
    "title": null
}

为什么会这样?使用此属性必须识别所有字段的名称

【问题讨论】:

    标签: .net json asp.net-web-api datacontractserializer


    【解决方案1】:

    这是因为您更改了属性名称。数据成员名称仍然保持不变。 试试这个:

    [DataContract]
    Public class Album
    {
        [DataMember(Name = "myproject")]
        Public int myproject{ get; set;}
    
        DataMember(Name = "id")]
        Public int id{ get; set;}
    
        DataMember(Name = "name")]
        Public string name{ get; set;}
    }
    

    【讨论】:

    • 但此属性的概念是字段名称不同,api 名称也不同。例如jsonplaceholder.typicode.com/albums 的名称为 userid、id、title,我希望在网站
    • 您仍然可以使用不同的名称,而不是我放在这里的名称。无论您在 DataMemeber 注释中分配什么名称,这些名称都将在返回 JSON 响应时代表您的字段。
    • 你可以在那里给你想要的名字,值将从你的属性中正确提供。
    • 另外,如果您跳过给它们命名,那么将使用您的原始属性名称。
    • 好的,但我问一些不同的问题,如果我输入不同的名字,为什么不工作。有什么问题我可以做些什么来使用不同的名字
    【解决方案2】:

    您是否尝试过使用 JsonProperty 属性?这就是我使用 JSON.NET 库 (Newtonsoft) 序列化/反序列化 JSON 的方式

    [JsonProperty("SomeJsonPropertyName")]
     public string YourNewPropertyName{ get; set; }
    

    希望这个链接也有帮助:JsonPropertyAttribute Name Documentation JSON.NET

    【讨论】:

    • 感谢您的帮助,但我有一个任务只能使用 Datamember 属性
    • 没问题。对不起,你没有那种灵活性。如果我找到一种仅使用数据成员属性的方法,我将更新我的答案。但是,希望您在那之前找到解决方案!
    猜你喜欢
    • 2014-08-25
    • 2020-01-29
    • 2016-06-24
    • 1970-01-01
    • 2020-06-25
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多