【问题标题】:WebApi2 Controller using Json.NET failing to deserialize single property使用 Json.NET 的 WebApi2 控制器无法反序列化单个属性
【发布时间】:2015-09-18 00:43:07
【问题描述】:

向使用 Json.NET 进行反序列化的 WebApi2 控制器发送带有已确认对象的 POST 请求时,未正确解析单个属性。

请求中发出的JSON如下:

{"ParentId":8,"Data":{"Description":"Estimated Man Hours ONSITE","ExternalItemKey":"Services:Man Hours","Quantity":0,"Price":150,"EstimatedCost":60},"ActualCost":60,"DateProvided":"2015-09-18T00:26:45.000Z","ReferencedQuotedDeliverableExternalGuid":"1b7e42be-670e-4d84-9600-15dff530363e","Notes":""}

Data.EstimatedCost 值反序列化为 0,可能是因为某些原因它没有被解析。所有其他值均已正确解析。

Json.NET 的版本是 6.0.0.0

【问题讨论】:

  • 在您的 JSON 中,ActualCost 属性不是 data 对象的一部分;它是包含对象的一部分。 (另一方面,EstimatedCostis 是数据对象的一部分。)您没有在问题中显示您的课程,但我怀疑这是您真正的问题。很多时候,如果您使用像 jsonlint.com 这样的 JSON 验证器来重新格式化 JSON,它会有所帮助。通过这种方式,哪些属性属于哪些对象变得更加明显。
  • 这是我的错字。它应该是“The Data.Estimated Cost value...” 感谢您指出!问题是 6.0.0.0 版本中的 JSON.NET 反序列化程序有一个错误。我提供此 Q/A 主要是为遇到相同问题的其他人提供解决方法。该错误可能会在以后的版本中得到修复,但如果您没有时间/手段更换库,那么解决方法很有用。
  • 我明白了;感谢您更新您的问题以澄清。

标签: c# .net post json.net asp.net-web-api2


【解决方案1】:

我为此找到的解决方案是使用以下语法标记未能按要求反序列化的变量:

using Newtonsoft.Json;

public class Deliverable
{
    [JsonProperty(Required = Required.Always)]
    public decimal EstimatedCost { get; private set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多