2017-09-05 27 views
0

我使用ASP.NET MVC 5在.NET Framework中运行。我有一个MVC控制器使用Newtonsoft.Json(或json.net)构建一个漂亮的JSON对象。我遇到麻烦的是,当我返回使用JsonResult方法Json(JSONdotnetObject)我的JSON,我结束了与具有相同的结构,我期望,但一切都是空谈JArrays像这样的结果:JSON对象在使用JsonResult返回时序列化为空括号

预期:

{ 
    "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这感觉就像一个黑客攻击的响应头。

让我知道你是否有任何想法或可以使用更多的细节。谢谢您的时间。

+1

你需要添加一些代码,以便我们可以看到你在做什么 – JSON

+0

会做。我将添加一些基于代码的基本实现。 –

+0

如果它是空的,我们需要看看你是如何填充对象。 – Amy

回答

3

问题是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类如图詹姆斯·牛顿 - 王的博客文章,ASP.NET MVC and Json.NET

+0

这对我来说非常合适。感谢您的快速简单的解释和代码片段。 –

+1

很高兴我能帮到你。 –