【问题标题】:Convert C# List of object to JavaScript array of objects将 C# 对象列表转换为 JavaScript 对象数组
【发布时间】:2013-09-23 18:35:10
【问题描述】:

我正在使用 jQueryUI 的autocomplete 来允许搜索用户。文档说明我可以使用数组作为数据源,格式如下:[ { label: "Choice1", value: "value1" }, ... ]

我有一个基类,它提供了一个由我的视图模型继承的唯一Users 列表。视图模型具有以下功能:

public List<TestJson> GetUsers()
{
    return AvailableUsers
        .Select(u => new TestJson
            {
                Label = u.LastName + ", " + u.FirstName + "(" + u.UserId + ")",
                Value = u.UserId
            }).ToList();
}

public class TestJson
{
    public string Label { set; get; }
    public string Value { get; set; }
}

在我看来,我是这样使用上面的:

var userNameList = @Html.Raw(Json.Encode(Model.GetUsers()));

$("#UserName").autocomplete({
    source:userNameList 
});

原来userNameList 是这样显示的:

[ { "Label": "Choice1", "Value": "value1" }, ... ]

代替:

[ { label: "Choice1", value: "value1" }, ... ]

如何让我的数组以正确的格式显示?

编辑:根据 cmets 的输入,我已经验证这两种格式在功能上确实是等效的。我做了更多测试,结果发现labelvalue 区分大小写。将我的成员更改为小写似乎可以解决问题,但我认为解决方案不是最好的。有关如何将 : 左侧的字符串(这叫什么?)更改为小写的任何建议?

【问题讨论】:

  • 这些输出中的任何一个都应该可以正常工作。你遇到了什么问题?
  • [ { label: "Choice1", value: "value1" }, ... ] 在功能上等同于[ { "label": "Choice1", "value": "value1" }, ... ],还是您遇到了问题?
  • @RobG 你是对的!请看我的编辑
  • 我也受到了同样的打击。为了克服这个问题,我选择了小写的属性。您可能会找到一个属性装饰来控制序列化期间使用的名称,但除非您使用 Newtonsoft 库,否则我看不到任何立即可用的内容:stackoverflow.com/questions/8796618/…
  • 经过深入研究,似乎 MVC 使用了 JavaScriptSerializer,它不像 JSON.NET 那样尊重 [DataMember] 属性。 stackoverflow.com/questions/12497124/… 所以你可以切换到 JSON.NET 或者看看这个:stackoverflow.com/questions/1302946/…

标签: c# jquery asp.net-mvc jquery-ui


【解决方案1】:
        //View.cshtml
<script type="text/javascript">
    var arrayOfArrays = JSON.parse('@Html.Raw(Json.Encode(Model.GetUsers()))');
</script>

【讨论】:

  • JSON = JavaScript Object Notation 所以如果它是一个有效的 JavaScript 对象,是否还需要解析它? var arrayOfArrays = @Html.Raw(Json.Encode(Model.GetUsers());
【解决方案2】:

一个简单的 Employee 对象:

public class Employee
{
public string Name { get; set; }
public string Age { get; set; }
public string ID { get; set; }   
}

将它们的一些实例添加到列表中:

Employee oEmployee1 = 
new Employee{Name="Pini",ID="111", Age="30"};

Employee oEmployee2 = 
new Employee { Name = "Yaniv", ID = "Cohen", Age = "31" };
Employee oEmployee3 = 
new Employee { Name = "Yoni", ID = "Biton", Age = "20" };

List<Employee> oList = new List<Employee>() 
{ oEmployee1, oEmployee2, oEmployee3 };

然后序列化:

System.Web.Script.Serialization.JavaScriptSerializer oSerializer = 
new System.Web.Script.Serialization.JavaScriptSerializer();
string sJSON = oSerializer.Serialize(oList);

这是输出:

[{"Name":"Pini","Age":"30","ID":"111"},
{"Name":"Yaniv","Age":"31","ID":"Cohen"},
{"Name":"Yoni","Age":"20","ID":"Biton"}]

下面的链接也有类似的例子

Convert Object to JSON in MVC 4

【讨论】:

    【解决方案3】:

    Jason P 和 Rob G 的评论是正确的。问题中的两种格式是等价的。原来我的问题出在外壳上。哦!

    我只是将类中的属性更改为小写。想,我很想看到一个替代的解决方案。我会选择这个,直到提交更好的。

    【讨论】:

    • 来这里是为了弄清楚如何将 C# 对象列表转换为 javascript 对象数组——你的问题是我的解决方案。谢谢。
    【解决方案4】:

    如果您通过 MVC 模型传递对象列表并希望将其存储在 .cshtml 页面 PFB 代码片段的脚本部分中的数组变量中:-

    @Html.Raw(Json.Encode(Model.ListPropertyName))
    

    【讨论】:

      【解决方案5】:

      我假设您正在使用 MVC。 WebAPI 将默认为 camelCase,而 MVC 默认为 PascalCase。

      另请参阅:Proper JSON serialization in MVC 4http://www.matskarlsson.se/blog/serialize-net-objects-as-camelcase-json

      【讨论】:

        【解决方案6】:

        从 .NET Core 3.0 开始,它更简单了。

        在你看来,不要这样做:

        var userNameList = @Html.Raw(Json.Encode(Model.GetUsers()));
        

        这样做:

        var userNameList = @Json.Serialize(Model.GetUsers());
        

        注意:

        1. 将键转换为 camelCase 是默认行为。
        2. 结果类型为IHtmlContent,不需要包裹在@Html.Raw()内。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-01
          • 2017-01-14
          • 1970-01-01
          • 2019-10-22
          • 1970-01-01
          • 2016-12-13
          • 1970-01-01
          相关资源
          最近更新 更多