C# WebApi-反序列化和序列化备用属性名称
我正试图弄清楚如何使用ASP.NET WebApi指定备用属性名,并使其适用于反序列化+序列化和JSON+XML。到目前为止,我只发现了部分解决方案 我希望将属性名称公开为带下划线的小写,并且(例如)具有不同的内部名称: 外部:C# WebApi-反序列化和序列化备用属性名称,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我正试图弄清楚如何使用ASP.NET WebApi指定备用属性名,并使其适用于反序列化+序列化和JSON+XML。到目前为止,我只发现了部分解决方案 我希望将属性名称公开为带下划线的小写,并且(例如)具有不同的内部名称: 外部: 第一场 第二场 内部: 第一项 项目二 对于测试,这里有一个控制器后操作,它只传递接收到的内容: // POST api/values public TestSerialization Post([FromBody]TestSerialization value
- 第一场
- 第二场
- 第一项
- 项目二
// 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”)]对两个方向的序列化都没有影响
- 使用JSON时,[JsonProperty(Name=“x”)]处理序列化(返回值)。(它是一个JSON.NET属性,默认序列化程序)
- ItemOne=“A值”
- ItemTwo=“值B”
- 字段1=“正确1”
- 字段二=“正确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; }
}
public class TestSerialization
{
[JsonProperty(PropertyName = "field_one")]
public string ItemOne { get; set; }
[JsonProperty(PropertyName = "field_two")]
public string ItemTwo { get; set; }
}
以下内容仅适用于Json格式化程序,也适用于序列化和反序列化
[DataContract]
public class TestSerialization
{
[DataMember(Name = "field_one")]
public string ItemOne { get; set; }
[DataMember(Name = "field_two")]
public string ItemTwo { get; set; }
}
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反序列化程序,尽管这样做有点烦人 然后,您可以将其作为作业对象使用,或调用
.ToObject()
然后将遵循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();
}
//发布api/值
公共IHttpActionResult帖子(作业对象内容)
{
var test=content.ToObject();
//现在,对象的属性已正确填充。
返回Ok();
}
Ah-通过类上的missed[DataContract]属性,来自服务器的序列化结果现在在JSON和XML中都是正确的。来自UI的传入请求仍然仅使用类的自然属性名称反序列化,而不是DataMember变量。这不应该发生……您可以共享原始请求吗?啊-我使用Postman创建请求,并使用“x-www-form-encoded”选项卡。在“原始”选项卡中使用手工输入的JSON数据可以得到预期的结果。我很傻,但我有点困惑,为什么“Rest API测试工具”在前两个选项卡(表单数据和表单urlendcoded)中有奇特的键/值编辑工具,其中生成JSON请求的工具是手动的…JsonProperty与问题中的操作不起作用。它总是被忽视。请描述您认为OP的发现/结论不正确的原因。我对这一项投了赞成票,因为当我使用它时,我立即发现了我的POCO没有被反序列化的原因。抽象类失败对我不起作用。内容始终为“空”。它使用([FromBody]TestSerialization值),但忽略JsonProperty。