我有一个这样的课程:
[serializable]
public class ComplexA{
public string A{get;set;}
public string B{get;set;}
public Foo Complex1 {get;set;}
}
[Serializable]
public class Foo{
public string Name{get;set;}
public Bar Prop1{get;set;}
}
[Serializable]
public class Bar{
public string A{get;set;}
public bool B{get;set;}
}
当创建ComplexA的对象并将其返回到视图时(使用来自jQuery的ajax调用),结果我得到这样的事情:
{
"A":"....",
"B":"...."
}
我从BusinessLayaer获取对象,并从debug中检查它,所有属性都有价值。 所以我不明白为什么不序列化整个对象。
我的行动是这样的:
[HttpPost]
public ActionResult GetData(){
var logic = new BL_Something();
ComplexA info = logic.GetData();
return Json(info);
}
所以我期待的结果是:
{
"A":"...",
"B":"...",
"Complex1":{
"Name":"...",
"Prop1": {
"A":"....",
"B":"false"
}
}
答案 0 :(得分:5)
默认情况下,MVC使用Microsoft的Xamarin类。与JavascriptSerializer相比,我有很多次发现这门课程很短。 WebAPI和未来版本的MVC已经切换到Json.NET作为默认的序列化程序。
有很多方法可以替换默认的序列化程序,但这需要付出很多努力。
您可以使用Json.NET序列化您的对象并通过更改您的返回值将其作为json返回:
System
这应该相当容易测试。我相信它会解决您的序列化问题。
为方便起见,您可以将动作方法放在控制器基类上,如下所示:
return Content(JsonConvert.SerializeObject(info), "application/json");
控制器中的用法:
public virtual ActionResult JsonResponse(object obj)
{
return Content(JsonConvert.SerializeObject(obj), "application/json");
}
答案 1 :(得分:0)
Json
方法应正确转换复杂对象。
以下带有硬编码值的代码应该可以正常工作。
[HttpPost]
public ActionResult GetData()
{
var info = new ComplexA
{
A = "test",
B = "BB",
Complex1 = new Foo {Name = "Ss", Prop1 = new Bar {A = "Name", B = false}}
};
return Json(info);
}
这将生成以下JSON
{
"A": "test",
"B": "BB",
"Complex1": {
"Name": "Ss",
"Prop1": {
"A": "Name",
"B": false
}
}
}
因此,如果您没有获得Complex1
属性,这意味着,在GetData
方法中,您没有正确初始化/设置该属性值。使用visual studio断点,看看它在你的方法中做了什么。