【问题标题】:How can I change asp.net mvc's way of formatting JSON?如何更改 asp.net mvc 格式化 JSON 的方式?
【发布时间】:2012-01-30 13:34:55
【问题描述】:

我有这个模型

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public List<Color> Colors { get; set; }
}

public class Color
{
    public int ColorId { get; set; }
    public string Name { get; set; }
}

asp.net MVC 的 return Json(...) 给了我这个:

[{"Name":"JC","Age":24,"Colors":[{"ColorId":1,"Name":"Red"},{"ColorId":2,"Name":"Blue"}]},
{"Name":"Albert","Age":29,"Colors":[{"ColorId":2,"Name":"Blue"}]}]

当我尝试返回一个类型时:List&lt;Person&gt;

但我想要这样的东西(如果可能的话):

{"People":[{"Name":"JC","Age":24,"Colors":[{"ColorId":1,"Name":"Red"},{"ColorId":2,"Name":"Blue"}]},{"Name":"Albert","Age":83,"Colors":[{"ColorId":2,"Name":"Blue"}]}]}

我的问题:

  • 如何让 C# (asp.net mvc) 以更好的格式返回 JSON,例如:(注意:忽略数据,我的重点是让它以“People”作为主要集合返回..我应该怎么做?JSON.net?)

    {"人物":[{"姓名":"JC","年龄":24,"颜色":[{"ColorId":1,"Name":"Red"},{"ColorId": 2,"姓名":"蓝色"}]}, {"Name":"Albert","Age":83,"Colors":[{"ColorId":2,"Name":"Blue"}]}]}

  • 或者我怎样才能使 KNOCKOUT.JS MAPPING PLUGIN 使用这种类型的 JSON 格式? (对于那些知道淘汰赛的人)

    [{"Name":"JC","Age":24,"Colors":[{"ColorId":1,"Name":"Red"},{"ColorId":2,"Name" :“蓝色”}]}, {"Name":"Albert","Age":29,"Colors":[{"ColorId":2,"Name":"Blue"}]}]


更新(额外说明/信息):

这是我的数据,我想返回一个列表

    private List<Person> _people = new List<Person>
                                        {
                                            new Person
                                                {
                                                    Name = "JC",
                                                    Age = 24,
                                                    Colors = new List<Color>
                                                                {
                                                                    Red,
                                                                    Blue,
                                                                }
                                                },
                                            new Person
                                                {
                                                    Name = "Albert",
                                                    Age = 29,
                                                    Colors = new List<Color>
                                                                {
                                                                    Blue
                                                                }
                                                }
                                        };

类似这样的 JSON 格式:

{"People":[{"Name":"JC","Age":24,"Colors":[{"ColorId":1,"Name":"Red"},{"ColorId":2,"Name":"Blue"}]},
{"Name":"Albert","Age":83,"Colors":[{"ColorId":2,"Name":"Blue"}]}]}

我只是想知道这是否可能,或者如果不是,那么我怎样才能使 knockout.js 映射插件适应 MVC 的返回 json 的方式?

【问题讨论】:

    标签: c# asp.net-mvc json knockout.js knockout-mapping-plugin


    【解决方案1】:

    您需要一个容器,因为您不想返回一个数组而是一个带有 People 变量的对象。

    类似这样的东西(使用动态):

    var jsonData = new 
                {
                    People = _people 
                };
    return Json(jsonData, JsonRequestBehavior.AllowGet);
    

    更新

    JSON 是一种非常简单的格式。让我们跳过您现在不需要的所有内容。

    • 对象:json 中的对象以{} 开头和结尾。其中的任何内容都对应于 C# 中的属性。
    • 数组:返回IEnumerable 将返回一个数组。数组可以包含其他数组、对象或简单字段。

    上面的代码在 C# 中使用了一个动态对象,可以翻译成如下所示的类:

    public class MyCustomClass
    {
        public IEnumerable<Person> People {get;set;}
    }
    

    因此它是一个返回数组的对象,结果是:

    { People: [] }
    

    {} 对应于MyCustomClass

    【讨论】:

    • 哇。我花了几个小时试图解决这个问题.. 由一个聪明人的一小段代码解决。多谢。介意你能告诉我更多关于你在那里做了什么的信息/解释吗?也许是一些资源、关键字的链接,或者你可以告诉我?我对 C# 和 JSON 还很陌生..
    • asp.net/mvc/tutorials 很好。那里有一些 JSON 和其他花哨的东西。
    【解决方案2】:

    您可以通过以下方式退货:

     var jsonData = new
                {
                    Name = qry.Name,
                    Age = qry.Age,
                    Colors = (
                        from c in qry
                        select new
                        {
                            ColorID = c.ColorID,
                            Name = c.Name
                        }).ToArray()
                };
    
    return Json(jsonData, JsonRequestBehavior.AllowGet);
    

    也许是这样的:)

    【讨论】:

    • 介意你能不能把它翻译成我的模型?我对此有点困惑,它会如何改变我的 json 格式。谢谢
    • 做了一些蒙眼编码,您可能需要更改一些内容才能使其按预期工作:) 并且 ofc 获取数据并将其放入“var qry = ..”
    • 我只是 c# 和 json 的初学者,但我认为您的代码不会返回 List (?) 类型...我更新了一些示例 C# 数据的问题。也许这可能会增加一些说明。再次感谢您的帮助。
    猜你喜欢
    • 2010-11-28
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2011-01-07
    相关资源
    最近更新 更多