【问题标题】:JSON passed to ApiController doesn't deserialize string values传递给 ApiController 的 JSON 不会反序列化字符串值
【发布时间】:2016-06-21 22:37:59
【问题描述】:

我正在尝试将 JSON 数组传递给 ApiController,但字符串值没有反序列化(它们被设置为空值)。奇怪的是我仍然得到正确数量的元素。

A 有一个 ApiController:

[RoutePrefix("api/language")]
public class LanguagePairApiController : ApiController

使用 post 方法:

// POST: api/language/create
[HttpPost]
[Route("create")]
public string Create([FromBody]LanguagePair[] languagePairs)

我正在向它发送 JSON:

[
    {"Key":"Test","Value":"Test","Version":"1.0"},
    {"Key":"Areyousure","Value":"Are you sure?","Version":"1.0"},
    {"Key":"File","Value":"File","Version":"1.0"}
]

这是我试图将其映射到的类:

public class LanguagePair
{
    public string Key { get; set; }
    public string Value { get; set; }
    public string Version { get; set; }
}

但字符串值以 null 的形式出现:

我错过了什么?
编辑:我已经找到了一个答案并将其发布在下面。但我仍在寻找更好的答案...

【问题讨论】:

  • 我对asp.net不太了解,但不是有一些机制可以自动开启camel case对象属性吗?尝试发送[{"key":"win"}] 给它。
  • 你实际使用的 jQuery 是什么

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


【解决方案1】:

我想通了。我需要用 DataContract 和 DataMember 属性来装饰这个类:

{
    [DataContract]
    public class LanguagePair
    {
        [DataMember]
        public string Key { get; set; }
        [DataMember]
        public string Value { get; set; }
        [DataMember]
        public string Version { get; set; }
    }
}

【讨论】:

  • 如果您想调整 JSON 属性的名称(例如发送 {"myKey":"Areyousure","question event with space":"Are you sure?","v":" 1.0"} ) 您可以相应地使用: [DataMember(Name = "myKey")], [DataMember(Name = "question event with space")], [DataMember(Name = "v")] 用于 C# 中的 LanguagePair 属性
【解决方案2】:

阅读Parameter Binding in ASP.NET Web API

您需要从您的操作中删除 [FromBody] 属性...

// POST: api/language/create
[HttpPost]
[Route("create")]
public string Create(LanguagePair[] languagePairs) { ... }

而且你可以让你的班级保持原来的精益:

public class LanguagePair
{
    public string Key { get; set; }
    public string Value { get; set; }
    public string Version { get; set; }
}

使用 [FromBody]

要强制 Web API 从请求正文中读取简单类型,请添加 [FromBody] 参数的属性:

public HttpResponseMessage Post([FromBody] string name) { ... }

在本例中,Web API 将使用媒体类型格式化程序来读取 请求正文中的名称值。这是一个示例客户端 请求。

POST http://localhost:5076/api/values HTTP/1.1
User-Agent: Fiddler
Host: localhost:5076
Content-Type: application/json
Content-Length: 7

"Alice"

当参数有[FromBody]时,Web API 使用 Content-Type 标题以选择格式化程序。在此示例中,内容类型为 "application/json" 并且请求正文是原始 JSON 字符串(不是 JSON 对象)。

【讨论】:

  • 我刚试过这个,我得到了相同的结果(一个包含所有值 == null 的 3 个对象的数组)。但是 [FromBody] 什么也没做 - 如果我删除它并保持 [DataContract] 它可以正常工作。
猜你喜欢
  • 2016-12-22
  • 2016-04-16
  • 2019-07-28
  • 1970-01-01
  • 2019-08-22
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多