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

问题描述 投票:0回答:2

我正在使用 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
对象正确地将
JObject
保存在
JsonResult.Data
字段中,但是当它返回时,ASP.NET 执行的序列化出现了问题,这导致了我失去了我美丽的 JSON 对象:*(

我已经通过简单地从方法中返回

JObject
而不是
ActionResult
来解决这个问题,但这并不理想,因为我必须使用
Result.ContentType
手动设置响应头,这感觉就像黑客。

如果您有任何想法或需要更多细节,请告诉我。谢谢您的宝贵时间。

c# asp.net .net asp.net-mvc-5 json.net
2个回答
8
投票

问题是 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 和 Json.NET 中所示。


0
投票

你需要施展。这是因为 JObject 与所使用的序列化程序不兼容。 但是经过数小时的努力你可以获得 MVC JsonResult 序列化

myJSON.ToObject<Dictionary<string, object>>()
如果它是一个JObject并且如果它是一个JArray你需要
myJSON.ToObject<List<Dictionary<string, object>>>()

© www.soinside.com 2019 - 2024. All rights reserved.