【问题标题】:WebApi - Deserializing and serializing alternate property namesWebApi - 反序列化和序列化备用属性名称
【发布时间】:2014-04-24 22:16:35
【问题描述】:

我试图弄清楚如何使用 ASP.NET WebApi 指定备用属性名称 - 并使其适用于反序列化 + 序列化以及 JSON + XML。到目前为止,我只发现了部分解决方案。

我想将属性名称显示为带下划线的小写字母,并且(例如,为了)具有不同的内部名称:

外部:

  • 字段一
  • 第二场

内部:

  • ItemOne
  • 项目二

为了测试,这里有一个 POST 控制器操作,它只是中继它接收到的内容:

// POST api/values
public TestSerialization Post([FromBody]TestSerialization value)
{
    return value;
}

还有一个测试实体:

public class TestSerialization
{
    [DataMember(Name = "field_one")] // Doesn't appear to change anything
    public string ItemOne { get; set; }

    [JsonProperty(PropertyName = "field_two")] // Only works for serialization in JSON mode
    public string ItemTwo { get; set; }
}

到目前为止,我发现:

  • [DataMember(Name = "x")] 对任一方向的序列化都没有影响
  • [JsonProperty(Name = "x")] 在使用 JSON 时适用于序列化(返回值)。 (这是一个 JSON.NET 属性,默认序列化程序)。

对于测试数据,我提交了 4 个属性,看看哪个值被反序列化,以及反序列化时的属性名称是什么

  • ItemOne = "值 A"
  • ItemTwo = "值 B"
  • field-one = "正确的 1"
  • field-two = "正确的 2"

我怎样才能做到这一点?

【问题讨论】:

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


    【解决方案1】:

    您的一些发现/结论不正确...您可以尝试以下方法:

    这应该适用于两者 web api 的默认 Xml 和 Json 格式化程序以及序列化和反序列化。

    [DataContract]
    public class TestSerialization
    {
        [DataMember(Name = "field_one")]
        public string ItemOne { get; set; }
    
        [DataMember(Name = "field_two")]
        public string ItemTwo { get; set; }
    }
    

    以下内容应仅适用于 Json 格式化程序以及序列化和反序列化。

    public class TestSerialization
    {
        [JsonProperty(PropertyName = "field_one")]
        public string ItemOne { get; set; }
    
        [JsonProperty(PropertyName = "field_two")]
        public string ItemTwo { get; set; }
    }
    

    【讨论】:

    • Ah - 由于类上缺少 [DataContract] 属性,服务器的序列化结果 from 现在在 JSON 和 XML 中都是正确的。来自 UI 的传入请求仍然仅使用类的自然属性名称进行反序列化,而不是 DataMember 变体。
    • 这不应该发生...你能分享一下你的原始请求是什么样的吗?
    • 啊 - 我正在使用 Postman 创建请求,并且正在使用“x-www-form-encoded”选项卡。在“原始”选项卡中使用手动输入的 JSON 数据可以得到预期的结果。愚蠢的我,但我有点困惑,为什么“Rest API 测试工具”有花哨的键/值编辑工具作为前 2 个选项卡(表单数据和表单 urlendcoded),工具在哪里生成 a JSON 请求是手动的...
    • JsonProperty 不适用于问题中的操作。它总是被忽略。请描述您认为 OP 的调查结果/结论不正确的原因。
    【解决方案2】:

    您可以通过将 JObject 传递给您的操作来强制 Asp.Net 使用 JSON 反序列化器,尽管这样做有点烦人。

    然后您可以将其作为 JObject 使用或调用 .ToObject<T>();,这将遵循 JsonProperty 属性。

    // POST api/values
    public IHttpActionResult Post(JObject content)
    {
        var test = content.ToObject<TestSerialization>();
        // now you have your object with the properties filled correctly.
        return Ok();
    }
    

    【讨论】:

    • 赞成这个,因为当我使用它时,我立即明白为什么我的 POCO 没有被反序列化。抽象类失败
    • 对我不起作用。内容始终为“空”。它适用于([FromBody]TestSerialization 值),但随后 JsonProperty 被忽略。
    猜你喜欢
    • 2013-11-16
    • 2013-10-09
    • 1970-01-01
    • 2021-07-22
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    相关资源
    最近更新 更多