Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebApi-反序列化和序列化备用属性名称_C#_Asp.net_Asp.net Web Api - Fatal编程技术网

C# WebApi-反序列化和序列化备用属性名称

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

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

我希望将属性名称公开为带下划线的小写,并且(例如)具有不同的内部名称:

外部:

  • 第一场
  • 第二场
内部:

  • 第一项
  • 项目二
对于测试,这里有一个控制器后操作,它只传递接收到的内容:

// 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属性,默认序列化程序)
对于测试数据,我提交了4个属性,以查看哪个值被反序列化,以及反序列化时的属性名称

  • 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。