asp.net-mvc - .NET Web API 将 JSON 反序列化为对象时出现问题

标签 asp.net-mvc json knockout.js

我接手了一个公司为我们开发的项目,不幸的是我们没有得到太多的支持,从长远来看,我们应该自己完成维护。该应用程序由一个简单的 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 框架,甚至无法告诉你这一点)。

这些是我的问题:

  1. 这是什么样的 .NET REST API 框架?我怎样才能区分?
  2. 这种隐式 JSON 反序列化是如何工作的,它有哪些缺陷,例如,当 JSON 的某些部分没有按预期反序列化时?尤其是在客户端(正如我所说,我没有修改服务器代码)
  3. 关于我可以对 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/

相关文章:

asp.net-mvc - 如何与 MVC 一起使用属性交换和/或简单注册?

c# - 使用 Autofac 注册以 Service 结尾的所有内容

javascript - Knockout.js - 尝试将 JSON 添加到 View 模型未定义

knockout.js - 尝试控制后代绑定(bind)的选项和组件

c# - 具有多个前导零小数的属性路由

javascript - 以向导形式传递数据而无需在 MVC 中回发

java - Spring Boot Redis 将 POJO 列表存储为值

javascript - 如何从 window.fetch() 响应中获取数据?

c# - 将嵌套的 json 字符串解析为字符串列表

javascript - 将项目添加到 ObservableArray() 并等待添加?