3

我正在尝试在 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);
}
4

3 回答 3

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

于 2013-04-09T00:46:14.157 回答
3

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

相反,创建name一个公共财产,它应该可以工作:

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

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

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

于 2013-04-08T23:54:49.113 回答
1

你不应该命名方法GetSet- 甚至不是GetNameand SetName,因为如果我记得我的 C# 读数正确,CLR 在将属性“翻译”为 CIL 代码时会按照惯例这样做(getter 变成“get”方法,setter 变成“设置”方法)。“正确”的方法是使用具有有意义名称的属性 - 你稍后会感谢自己:

private string _name;
public string Name { get { return _name; } set { _name=value; } }
于 2013-04-09T00:54:12.213 回答