【问题标题】:How to deserialize a dynamic property in a well defined model?如何在定义明确的模型中反序列化动态属性?
【发布时间】:2013-02-03 20:28:42
【问题描述】:

我有一个 web api 方法定义如下:

[HttpPost]
public void Post(Input model)
{
    ...
}  

使用这样的输入模型:

public class Input
{
    public string Id { get; set; }
    public object Extra { get; set; }
}

我想要做的是传递一个有效的 JSON 对象作为额外参数,如下面的 jQuery 示例:

$.post(
    'http://localhost/api/myController',
    { 
        id: 'someId',               
        extra: { 
            tags: ['a', 'b'],
            anotherValue: 'hello',
            oneMore: { 
                foo: 'bar'
            }
        }
    });

Id 正确地进入了我的 model.Id 属性。但是,extra 属性是作为 {object} 出现的,由于我不知道其中有什么,我无法以任何方式对其进行反序列化。

我尝试使其 dynamic 和/或将其转换为 dynamic/ExpandoObject/Dictionary 但没有成功。我知道如果我只收到一个原始的 HttpRequestMessage 并自己处理它,我可能可以让它工作。但是,我宁愿不这样做,而是依赖 .NET 的所有验证。

有可能吗?

谢谢

编辑 1: 在测试了更多替代方案后,我发现 extra 属性没有任何实际价值,它只是初始化为 new object() 。看起来默认模型绑定器实现不处理动态 JSON(至少不是这样),只是调用它无法处理的模型属性的默认构造函数。

【问题讨论】:

  • @SanjaMelnichuk 我不明白这对我有什么帮助。我没有可用于传递给反序列化器的 JSON 字符串。我只有模型对象。

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


【解决方案1】:

将您的属性定义为object 应该可以工作,或者如果您想更明确,您可以将Extra 属性指定为JObject 类型。

但是问题在于$.post 请求。为了将复杂数据发布到 web.api 方法并允许模型绑定,您需要做两件事:

  • 将内容类型设置为“application/json”
  • 并以 JSON 格式发送数据并调用JSON.stringify

但是$.post你不能指定内容类型所以你需要使用$.ajax:

因此,以下调用应将数据发布到您的操作中:

$.ajax({
    url: 'http://localhost/api/myController',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(
    { 
        id: 'someId',               
        extra: { 
            tags: ['a', 'b'],
            anotherValue: 'hello',
            oneMore: { 
                foo: 'bar'
            }
        }
    })
});

【讨论】:

  • 它工作了@nemesv!谢谢:) 还有一件事:调用者需要在不这样做时对数据进行字符串化要容易得多。当呼叫者不必这样做时,是否还有另一个?我可以为我的消费者提供一个 JS 客户端,但如果他们想构建自己的,那么不使用 stringify 会简单得多。再次感谢!
  • @tucaz 一般来说,如果客户端发送一个有效的 JSON 有效负载就足够了。但是,如果客户端是用 JQuery 实现的,因为 $.ajax 方法调用将:the Data is converted to a query string, if not already a string. 所以你需要调用 JSON.stringify 否则 $.ajax url 编码你的数据。但如果您有其他客户,则无需致电JSON.stringify
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
相关资源
最近更新 更多