Asp.net mvc .NET Web API在将JSON反序列化到对象时出现问题

Asp.net mvc .NET Web API在将JSON反序列化到对象时出现问题,asp.net-mvc,json,knockout.js,Asp.net Mvc,Json,Knockout.js,我超过了一个由一家公司为我们开发的项目,不幸的是我们没有得到太多的支持,从长远来看,我们应该自己完成维护工作。该应用程序由一个简单的Web客户端(HTTP、JavaScript、Knockout Framework)和一个RESTAPI服务(.NET4.5,我想是ASP.NETMVC)组成 目前,我只修改了客户端,因此服务器仍应按预期工作 在客户端,我稍微修改了Knockout视图模型(添加了一些可计算性和一些值的优化表示)。视图模型由“问题”和“评论”组成(作为问题的数组,它实际上是一个Bug

我超过了一个由一家公司为我们开发的项目,不幸的是我们没有得到太多的支持,从长远来看,我们应该自己完成维护工作。该应用程序由一个简单的Web客户端(HTTP、JavaScript、Knockout Framework)和一个RESTAPI服务(.NET4.5,我想是ASP.NETMVC)组成

目前,我只修改了客户端,因此服务器仍应按预期工作

在客户端,我稍微修改了Knockout视图模型(添加了一些可计算性和一些值的优化表示)。视图模型由“问题”和“评论”组成(作为问题的数组,它实际上是一个Bug跟踪器)。如果我创建了一个新的问题,说明会添加到第一条注释中,整个模型是JSON.stringified,并发送到.NET API服务。我用Firebug证明,发布的JSON如下所示:

{
   "Id":0,
   "Title":"THis is a title",
   "Comments":[
       {
          "Id":1,
          "Text":"this is the first comment"
       }
   ]
}
在客户端,我有一个“IssueController”:

issue domain模型对象也有一个用于保存注释的数组,但在这方面它已经是空的了。NET代码没有任何明确解析JSON的部分,据我所知,MVC框架通过相同的属性名隐式解析JSON(是这样吗?)

反序列化已经按预期工作,因此.NET代码应该很好,但我似乎在某种程度上修改了JSON,注释的隐式映射不再工作。不幸的是,我对.NETMVC框架没有太多经验(或者只是.NETWebAPI框架,我甚至不能告诉你)

以下是我的问题:

  • 那是什么样的.NETRESTAPI框架?我怎样才能分辨
  • 这种隐式JSON反序列化是如何工作的,它的缺陷是什么,例如当JSON的某些部分并没有按预期进行反序列化时?特别是在客户端(正如我所说,我没有修改服务器代码)
  • 关于我可以对JSON做些什么,服务器不再喜欢它,有什么想法吗?;)
    编辑

    Issue.cs看起来是这样的(当然是简化的):


    我刚刚试着直接从你的帖子中找到你的代码,它对我起了作用

    因此,在你这方面,有一些事情可能会出问题:

    • 当您将对象发布到服务器时,请确保您正在将Knockout observable转换回json对象。因此,在ajax请求中,确保它看起来像:
      data:ko.toJSON(issue)
      ,而不仅仅是
      data:issue
    • 将对象发布到服务器时,确保发送了header
      content-type:application/json
    以下是您其他问题的答案:

    那是什么样的.NETRESTAPI框架?我怎样才能分辨

    这看起来不像是任何定制的(至少是您发布的内容),它只是.NET中的纯Web API

    这种隐式JSON反序列化是如何工作的,它的缺陷是什么,例如当JSON的某些部分并没有按预期进行反序列化时?特别是在客户端(正如我所说,我没有修改服务器代码)

    服务器上的反序列化使用基于客户端设置的
    内容类型的格式化程序集合。如果您想自定义它,这可能会变得复杂,但是有一些信息

    关于我可以对JSON做些什么,服务器不再喜欢它,有什么想法吗?;)


    就像我说的,你的代码对我有用

    解决了这个问题,这个问题是一个返回注释排序数组的计算结果。所以我的淘汰模型包含一个

    self.Comments = ko.observableArray([]); //...which gets filled with the comments of an issue
    

    self.CommentsSorted = ko.computed(function() {...}); //...which simply returns a sorted Comments array
    
    因此,当我序列化这个模型时,发布的JSON现在表示
    Comments
    数组,但也表示
    commentsorted
    数组。只有当我这样做的时候

    var i = ko.toJS(issue);
    delete i.CommentsSorted;
    
    在我将
    I
    作为数据发布之前,.NET能够正确地反序列化
    注释

    关于这一点的神秘之处在于,在我的淘汰模型中总是有其他计算字段,它们被.NET完全忽略,并且不会以任何方式干扰反序列化。因此,它似乎主要取决于模型中字段的名称和类型(可能是第一个字母相等吗?)

    好消息是:它现在可以工作了
    糟糕的是,.NET如何进行JSON数据的反序列化并不确定,如果它的行为不符合预期,我也无法进行调试。

    您可以添加数据类,比如PostIssues吗?(所有带有“Id”、“Text”、“Comments{“Id”、“Text”}Comments属性是在DomainObject类中定义的吗?DomainObject是一个抽象类,只是为域模型类定义了一些真正的基本行为。我认为这里没有什么有趣的地方,除了你告诉我应该查找什么。你没有定义字段的Comments属性。@UfukHacıoğulları抱歉,你是对的,是因为tr而造成的打字错误将德语代码翻译成英语;)纠正了itMhm,非常奇怪,正如我所说,原始代码不是我的,因此我也很难理解一些事情。最初在observable发布之前,有一个
    var I=JSON.parse(ko.toJSON(issue));
    (我猜是为了验证生成的JSON)。然后,最初的程序员做了一个
    data:ko.toJS(i)
    将数据传递给ajax post函数。在Firebug中,我还检查了内容类型是否为application/json。然后,我使用了
    ko.toJSON(问题)
    正如您所建议的,生成的帖子是相同的,但在服务器端,问题对象仍然是反序列化的,没有注释。是否有问题,因为可观察对象的所有计算字段(我有一个“SortedComments”、“FirstComment”、“LastComment”)也包含在JSON中,但在服务器端没有等效字段?如果有太多字段无法正确映射,映射是否会失败?不,它应该忽略它们。我建议在postssues()的第一行放置一个断点,并检查发布的
    self.Comments = ko.observableArray([]); //...which gets filled with the comments of an issue
    
    self.CommentsSorted = ko.computed(function() {...}); //...which simply returns a sorted Comments array
    
    var i = ko.toJS(issue);
    delete i.CommentsSorted;