我接手了一个公司为我们开发的项目,不幸的是我们没有得到太多的支持,从长远来看,我们应该自己完成维护。该应用程序由一个简单的 Web 客户端(HTTP、JavaScript、Knockout Framework)和一个 REST API 服务(我猜是 .NET 4.5、ASP.NET MVC)组成。
目前我只是修改客户端,因此服务器应该仍然可以按预期工作。
在客户端,我稍微修改了 Knockout View 模型(添加了一些可计算项并优化了一些值的表示)。 View 模型由“问题”和“评论”组成(作为问题的数组,实际上它是一个错误跟踪器)。如果我创建一个新问题,描述将添加到第一个评论中,整个模型是 JSON.stringified 并发送到 .NET API 服务。我用 Firebug 证明了,发布的 JSON 如下所示:
{
"Id":0,
"Title":"THis is a title",
"Comments":[
{
"Id":1,
"Text":"this is the first comment"
}
]
}
在客户端,我有一个“IssueController”:
[HttpPost]
public HttpResponseMessage PostIssues( Issue issue ) {
//issue should already hold the deserialized content of the JSON here,
//but it only contains 'Id' and 'Title' not the 'Comments' (empty List)
...
}
问题域模型对象还有一个用于保存注释的数组,但此时它已经是空的。 .NET 代码没有任何显式解析 JSON 的部分,据我了解,MVC 框架通过相同的属性名称隐式地执行此操作(对吗?)。
反序列化已经按预期工作,因此 .NET 代码应该没问题,但我看起来好像已经以某种方式修改了 JSON,这种隐式注释映射不再起作用。不幸的是,我对 .NET MVC 框架没有太多经验(或者它只是 .NET WebAPI 框架,甚至无法告诉你这一点)。
这些是我的问题:
- 这是什么样的 .NET REST API 框架?我怎样才能区分?
- 这种隐式 JSON 反序列化是如何工作的,它有哪些缺陷,例如,当 JSON 的某些部分没有按预期反序列化时?尤其是在客户端(正如我所说,我没有修改服务器代码)
- 关于我可以对 JSON 做什么,服务器不再喜欢它有什么想法吗? ;)
编辑
Issue.cs 看起来像这样(肯定是简化的):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bo;
using Projects.DomainObjects;
namespace Projects.Models {
public class Issue : DomainObject {
public Issue() {
this.Comments = new List<Comment>();
}
public long Id { get; set; }
private string _Title;
public string Title { get { return _Title; } set { _Title = value; NotifyChanged(); } }
public List<Comment> Comments { get; set; }
}
评论.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Common;
using Projects.DomainObjects;
namespace Projects.Models {
public class Comment : DomainObject {
public Comment() {
}
public long Id { get; set; }
public string Text { get; set; }
}
最佳答案
我只是尝试直接从您的帖子中获取您的代码,它对我有用。
因此,您可能会遇到一些问题:
- 当您将对象发布到服务器时,请确保从 Knockout observable 转换回 json 对象。因此,在您的 ajax 请求中,请确保它看起来像:
data: ko.toJSON(issue)
而不仅仅是data: issues
。 - 将对象发布到服务器时,请确保发送 header
content-type: application/json
以下是您其他问题的答案:
这是什么样的 .NET REST API 框架?怎么区分?
这看起来不像任何自定义内容(至少,您发布的内容),它只是 .NET 中的直接 Web API。
这种隐式 JSON 反序列化是如何工作的,它有哪些缺陷,例如,当 JSON 的某些部分没有按预期反序列化时?尤其是在客户端(正如我所说,我没有修改服务器代码)
服务器上的反序列化使用基于客户端设置的内容类型
工作的格式化程序集合。如果您想自定义它,这可能会变得复杂,但有信息 here
关于我可以对 JSON 做些什么,但服务器不再喜欢它,有什么想法吗? ;)
正如我所说,你的代码对我有用!
关于asp.net-mvc - .NET Web API 将 JSON 反序列化为对象时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21060514/