WebApi – 反序列化和序列化备用属性名称
我试图找出如何使用ASP.NET WebApi指定备用属性名称 – 并使其适用于反序列化+序列化以及JSON + XML。 到目前为止,我只发现了部分解决方案。
我想将属性名称公开为带有下划线的小写,并且(例如)为了具有不同的内部名称:
外部:
- 现场一个
- 现场二
内部:
- ItemOne
- ItemTwo
对于测试,这是一个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”
我怎样才能做到这一点?
您的一些调查结果/结论不正确……您可以尝试以下方法:
这应该适用于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; } }
您可以通过将JObject传递给您的操作来强制Asp.Net使用JSON反序列化器,尽管这样做有点烦人。
然后你可以用它作为JObject或调用.ToObject
然后JsonProperty
属性。
// POST api/values public IHttpActionResult Post(JObject content) { var test = content.ToObject(); // now you have your object with the properties filled correctly. return Ok(); }