【问题标题】:How to hide parts of a model when returning a response in Web API?在 Web API 中返回响应时如何隐藏模型的某些部分?
【发布时间】:2019-02-21 06:20:34
【问题描述】:

我有这个响应类:

public class Response
    {
        public bool isSuccess { get; set; }
        public string source { get; set; }
        public string number { get; set; }
        public string message { get; set; }

    }

如果响应成功,我只想返回成功、来源、编号而不是消息。但是当它失败时,我只想返回 issuccess 和消息。这可能吗?当值为空/空时,是否有可以隐藏对象的属性标签?

【问题讨论】:

  • 假设您计划为该功能编写一个方法,从哪里使用它?它会通过 Web api 公开,还是被解决方案中的另一段代码等消耗?

标签: c# object asp.net-web-api model


【解决方案1】:

要一直忽略,可以使用[ScriptIgnore],如果你正在使用 System.Web.Script.Serialization for Json.Net 你可以使用属性[JsonIgnore]

对于条件属性序列化,您可以使用ShouldSerialize{PropertyName},它被大多数 Serializer 所接受。

你可以像下面这样编写你的模型。

 public class Response
        {
            public bool isSuccess { get; set; }
            public string source { get; set; }
            public string number { get; set; }
            public string message { get; set; }
            public bool ShouldSerializemessage()
            {
                return (!isSuccess); 
            }

            public bool ShouldSerializesource()
            {
                return (isSuccess);
            }
            public bool ShouldSerializenumber()
            {
                return (isSuccess);
            }
        }

您可以阅读有关此herehere 的更多信息

【讨论】:

    【解决方案2】:

    您可以在模型上使用 DataContract/Datamemeber。

    [DataContract]
    public class Response
    {
        [DataMember(Name = "isSuccess")]
        public bool IsSuccess { get; set; }
    
        [DataMember(EmitDefaultValue = false, Name = "source")]
        public string Source { get; set; }
    
        [DataMember(EmitDefaultValue = false, Name = "number")]
        public string Number { get; set; }
    
        [DataMember(EmitDefaultValue = false, Name = "message")]
        public string Message { get; set; }
    } 
    

    填充模型后,请确保根据您的条件,不需要的属性为其默认值。在这种情况下,字符串为空。

    额外的优势:使用数据协定还可以让您的属性遵循 C# 命名标准,同时保持 JSON 按预期输出。如上代码所示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      相关资源
      最近更新 更多