【问题标题】:How to return JSon object如何返回 JSON 对象
【发布时间】:2013-05-02 18:06:36
【问题描述】:

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

{ 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);

但这只会返回一行。你能帮我返回一个以上的结果吗?我怎样才能得到上面指定格式的结果?

【问题讨论】:

标签: c# json json.net


【解决方案1】:

首先是no such thing as a JSON object。您在问题中得到的是一个 JavaScript 对象文字(有关差异的精彩讨论,请参见 here)。以下是您将如何将您拥有的内容序列化为 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 具有 ids 类型的 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"
    }
  ]
}

【讨论】:

  • 我会将 ID 保留为 int 或代码中有意义的任何内容;无论哪种方式,Javascript 通常都可以很好地处理它们,因此您不妨尽可能利用强类型。 .ToString() 如果需要作为传输字符串,则始终存在。
  • @anaximander:确实如此。我个人也更喜欢int。我会改回来并记下。感谢您的反馈!
  • @AndrewWhitaker:您发布的代码无法编译。它给出的错误为“预期类型”、“;预期”、“无效的表达式术语 ','”、“新的表达式需要 () 或 [] 在类型之后”和“无效的表达式术语 ()”
  • @user1640256:您使用的是什么版本的 .NET 框架?
【解决方案2】:

您只有一行要序列化。尝试这样的事情:

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 所要求的内容——他正在生成一个具有单个属性 resultsobject,而不是结果数组。
  • 这不会产生 OP 要求的结果,它缺少具有 results 属性的对象。
  • 如果 OP 希望输出结果,但他的根节点称为 results
  • 否,results 变量的类型为 results,resultRows 的类型为 List&lt;T&gt;
  • @ShaneBlake-我使用的是 .net framework 2.0 所以 System.Web.Extension 命名空间不可用。
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 2020-10-06
  • 2011-01-01
  • 2023-03-27
  • 1970-01-01
  • 2020-10-16
相关资源
最近更新 更多