我试图在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);
}
答案 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)
您假设框架可以推断get
和set
设置私有变量name
的值..它不会。
相反,将name
设为公共财产,它应该有效:
public class A {
public string Name { get; set; }
}
A obj = new A() { Name = "Abc" };
/* ...etc... */
从框架的角度考虑这个问题。如何确定get
或set
正在做什么?他们访问同一个变量吗?谁知道..毕竟它的运行时间。这就是为什么方法不能按照你假设的方式进行序列化的原因。
答案 2 :(得分:1)
你不应该命名方法Get
和Set
- 甚至不是GetName
和SetName
,因为如果我记得我的C#读数正确,那么CLR会通过将“转换”属性转换为CIL代码时的约定(getter变为“get”方法,setter变为“set”方法)。 “正确”的方式是使用具有有意义名称的属性 - 您将在以后感谢自己:
private string _name;
public string Name { get { return _name; } set { _name=value; } }