如何返回JSon对象

28

我正在使用一个需要以下结构的JSON对象的jQuery插件(我将从数据库中检索值):

{ results: [
    { id: "1", value: "ABC", info: "ABC" },
    { id: "2", value: "JKL", info: "JKL" },
    { id: "3", value: "XYZ", info: "XYZ" }
] }

这是我的课程:

public class results
{
    int _id;
    string _value;
    string _info;

    public int id
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
        }
    }
    public string value
    {
        get
        {
            return _value;
        }
        set
        {
            _value = value;
        }
    }
    public string info
    {
        get
        {
            return _info;
        }
        set
        {
            _info = value;
        }
    }
}

这是我序列化它的方式:

results result = new results();
result.id = 1;
result.value = "ABC";
result.info = "ABC";
string json = JsonConvert.SerializeObject(result);
但这只会返回一行数据。您能帮我返回多个结果吗?我怎样才能按照上面指定的格式获取结果呢?

7
你的 result 变量是一个单项,不是一个集合。如果你想要一个项目数组,你需要一个集合。 - Oded
你可以查看以下链接:https://dev59.com/Tm025IYBdhLWcg3wIyKf#6201609 - nercan
1
http://james.newtonking.com/projects/json/help/index.html?topic=html/SerializingCollections.htm - user195488
@nercan:这与他的问题无关...他正在使用James Newton-King的插件。 - user195488
2个回答

37
首先,JSON对象并不存在。你在问题中提到的是JavaScript对象字面量(关于区别可以看这里进行深入讨论)。以下是如何将你拥有的内容序列化为JSON:
我会使用一个匿名类型填充你的results类型:
string json = JsonConvert.SerializeObject(new
{
    results = new List<Result>()
    {
        new Result { id = 1, value = "ABC", info = "ABC" },
        new Result { id = 2, value = "JKL", info = "JKL" }
    }
});

请注意,生成的JSON结果项中的id类型为Number而非字符串。我认为这不会成为问题,但在C#中更改id的类型为string也很容易。
我还建议微调您的results类型并且去掉后备字段。
public class Result
{
    public int id { get ;set; }
    public string value { get; set; }
    public string info { get; set; }
}

此外,类的命名惯例是使用帕斯卡命名法(PascalCased),而不是驼峰命名法(camelCased)。
以下是上述代码生成的JSON:
{
  "results": [
    {
      "id": 1,
      "value": "ABC",
      "info": "ABC"
    },
    {
      "id": 2,
      "value": "JKL",
      "info": "JKL"
    }
  ]
}

1
我会将ID保留为'int'或代码中有意义的类型;无论如何,Javascript通常都能很好地处理它们,因此您可以在尽可能利用强类型的同时。如果需要传输字符串,始终可以使用.ToString() - anaximander
1
@anaximander:没错。我个人也更喜欢使用 int。我会把它改回来并做个注释。感谢您的反馈! - Andrew Whitaker
@AndrewWhitaker:你发布的代码无法通过编译。它给出了以下错误提示:"需要类型","需要;","无效的表达式项 ','","新表达式需要在类型后面加上 () 或者 []",以及 "无效的表达式项 ()"。 - user1640256
@user1640256:你使用的是哪个版本的.NET框架? - Andrew Whitaker

6
你只有一行需要序列化。可以尝试以下方法:
List<results> resultRows = new List<results>

resultRows.Add(new results{id = 1, value="ABC", info="ABC"});
resultRows.Add(new results{id = 2, value="XYZ", info="XYZ"});

string json = JavaScriptSerializer.Serialize(new { results = resultRows});
  • 编辑以匹配OP的原始json输出

** 编辑2:抱歉,我错过了他正在使用JSON.NET。使用JavaScriptSerializer以上代码会产生以下结果:

{"results":[{"id":1,"value":"ABC","info":"ABC"},{"id":2,"value":"XYZ","info":"XYZ"}]}

这不会生成OP所要求的内容 - 他正在生成一个具有单个属性“results”的对象,而不是结果数组。 - Andrew Whitaker
这不会产生OP所要求的结果,它缺少带有“results”属性的对象。 - heavyd
如果OP想要结果分解,那么这将起作用,但他的根节点被称为“results”。 - user195488
不,results变量的类型是results,而resultRows的类型是List<T> - user195488
我觉得这很奇怪,但没关系。 - user195488
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接