JSON 对象在使用 JsonResult 返回时被序列化为空括号

Posted

技术标签:

【中文标题】JSON 对象在使用 JsonResult 返回时被序列化为空括号【英文标题】:JSON Objects are serialized to empty brackets when returned using JsonResult 【发布时间】:2018-02-13 23:04:44 【问题描述】:

我正在使用 ASP.NET MVC 5 在 .NET Framework 中运行。我有一个 MVC 控制器,它使用 Newtonsoft.Json(或 json.net)来构建一个不错的 JSON 对象。我遇到的问题是,当我使用JsonResult 方法Json(JSONdotnetObject) 返回我的json 时,我最终得到的结果与我预期的结构相同,但所有内容都是空的JArrays,如下所示:

预期:


    "prop": 
        ... some stuff ...
     ,
     "another prop": 
         ... more stuff ...
     

实际:

[
    [
        ... empty ...
    ],
    [
        ... also empty ...
    ]
]

这是代码:

public ActionResult methodName(string input) 
    JObject myJSON = new JObject();

    // Populate myJSON with children
    foreach (Thing thing in ExistingEntityFrameworkCustomClass) 
        JObject newChild = new JObject();

        // Add some props to newChild using newChild["propName"] = thing.Property

        myJSON.Add(newChild.UniqueIdTakenFromEntity.ToString(), newChild);
    

    // The JsonResult successfully populates it's Data field with myJSON before returning.
    return Json(myJSON, JsonRequestBehavoir.AllowGet); 

这不是确切的结构,但希望它能说明我正在经历的事情。我已经在 VS 中逐行浏览了程序,JsonResult 对象在JsonResult.Data 字段中正确保存了JObject,但是当它返回时,ASP.NET 执行的序列化出现问题,这导致我失去了我美丽的 JSON 对象 :*(

我通过简单地从方法中返回 JObject 而不是 ActionResult 来解决这个问题,但这并不理想,因为我必须使用 Result.ContentType 手动设置响应标头,这感觉就像是 hack .

如果您有任何想法或可以使用更多细节,请告诉我。感谢您的宝贵时间。

【问题讨论】:

您需要添加一些代码以便我们看到您在做什么 会的。我将添加一些我正在做的代码方面的基本实现。 如果它是空的,我们需要看看你是如何填充对象的。 编辑添加了一些关于我如何填充对象的细节。 【参考方案1】:

问题是MVC Controller类中的Json方法在内部使用javascriptSerializer(不是Json.Net),不知道如何正确序列化一个JObject。尝试改用Content 方法:

public ActionResult methodName(string input) 
    JObject myJSON = new JObject();

    // Populate myJSON with children

    return Content(myJSON.ToString(), "application/json", Encoding.UTF8); 

或者,您可以实现自己的 JsonNetResult 类,如 James Newton-King 的博客文章 ASP.NET MVC and Json.NET 中所示。

【讨论】:

这非常适合我。感谢您快速简单的解释和代码 sn-p。 很高兴我能帮上忙。

以上是关于JSON 对象在使用 JsonResult 返回时被序列化为空括号的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net MVC:如何基于原始Json数据创建JsonResult

如何在 MVC4 中将 Json 字符串输出为 JsonResult?

从没有属性的 web api 返回 JsonResult

Mvc重写JsonResult

ObjectResult 和 JsonResult 有啥区别

从web api返回没有其属性的JsonResult