ASP MVC 4返回json复杂对象

时间:2015-12-01 16:31:33

标签: asp.net json asp.net-mvc

我有一个这样的课程:

[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"
       }
   }

2 个答案:

答案 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断点,看看它在你的方法中做了什么。