【问题标题】:Why is my entire object serialized as Array when DataMember's Name is "length"当 DataMember 的名称为“长度”时,为什么我的整个对象序列化为数组
【发布时间】:2015-07-16 12:53:27
【问题描述】:

我创建了一个新的 ASP.NET MVC 4 Web 应用程序并修改了默认的 ValuesController,如下所示:

using System.Runtime.Serialization;
using System.Web.Http;

namespace WebSerializationTest.Controllers
{
    public class ValuesController : ApiController
    {
        // GET api/values
        public ApiResponse Get()
        {
            ApiResponse res = new ApiResponse();
            res.Length = 120;
            return res;
        }
    }

    [DataContract]
    public class ApiResponse
    {
        [DataMember(Name = "length")]
        public int Length { get; set; }
    }
}

现在,当我从浏览器发出请求时(标头设置为 Accept: application/json),我得到了这个 JSON:

[
    120
]

但是当我将 DataMember Name 更改为其他任何内容时,即使是 [DataMember(Name = "Length")] 我得到正确的 JSON:

{
    "Length" : 120
}

字符串“长度”是否被禁止或导致此行为的原因是什么?

顺便说一句。我将目标框架设置为 .NET Framework 4,但我也尝试过 .NET Framework 4.5.1,但问题仍然存在。

【问题讨论】:

  • WebAPI 使用 JSON.NET 作为默认的 JSON 序列化程序。如果您使用 JSON.NET 对其进行序列化,您能否使用已装饰的 ApiResponse 模型重现该问题?
  • 只需使用[JsonProperty(PropertyName="length")] 代替DataContractDataMember
  • 无法使用 Visual Studio 2013、.NET 4.5、Newtonsoft.Json 4.5.0.0 重现
  • 我不会投票关闭它,因为它是插件中的一个错误。许多其他人很容易注意到同样的问题。
  • 另外,如果您只想从 UpperCamelCase 转换为 lowerCamelCase,您可以使用 JSON.NET 设置一个本地方法,称为 CamelCasePropertyNamesContractResolver

标签: c# json asp.net-mvc-4


【解决方案1】:

原来这是我使用的名为 RESTClient 的 Firefox 插件中的一个错误。

响应正文(突出显示)选项卡中,JSON 呈现不正确,但在 响应正文(原始)选项卡中,JSON 是正确的。

我还发现它是 known bug,自 2012 年以来一直没有修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 2020-08-29
    • 1970-01-01
    • 2011-02-27
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多