返回空的Json对象

时间:2013-04-08 23:51:12

标签: c# asp.net-mvc json

我试图在C#中返回一个Json对象。我是MVC控制器的新手并且第一次使用Json,我返回这个对象,它是空的。

public class A
{
    private string name;
    public void set(string data)
    {
        name = data;
    }
    public string get()
    {
        return name;
    }
}
public JsonResult Hello()
{
    A obj = new A();
    obj.set("Abc");
    JavaScriptSerializer js = new JavaScriptSerializer();
    string jsonVar = js.Serialize(obj);
    return Json(jsonVar, JsonRequestBehavior.AllowGet);
}

3 个答案:

答案 0 :(得分:4)

在C#中,我们可以自动创建(在C#3+中)的属性。

public class A
{
    public string Name { get; set; }
}

其次,您需要返回包装在新对象中的对象,以便JSON正确返回。您不需要自己序列化对象(因为您可以将其作为ActionResult返回)。

public JsonResult Hello()
{
    A obj = new A();
    obj.Name = "Abc";
    return Json(new { obj }, JsonRequestBehavior.AllowGet);
}

这将创建一个新的Json对象{"obj":{"Name":"Abc"}}

答案 1 :(得分:3)

您假设框架可以推断getset设置私有变量name的值..它不会。

相反,将name设为公共财产,它应该有效:

public class A {
    public string Name { get; set; }
}

A obj = new A() { Name = "Abc" };
/* ...etc... */

从框架的角度考虑这个问题。如何确定getset正在做什么?他们访问同一个变量吗?谁知道..毕竟它的运行时间。这就是为什么方法不能按照你假设的方式进行序列化的原因。

答案 2 :(得分:1)

你不应该命名方法GetSet - 甚至不是GetNameSetName,因为如果我记得我的C#读数正确,那么CLR会通过将“转换”属性转换为CIL代码时的约定(getter变为“get”方法,setter变为“set”方法)。 “正确”的方式是使用具有有意义名称的属性 - 您将在以后感谢自己:

private string _name;
public string Name { get { return _name; } set { _name=value; } }