将C#对象转换为JSON或Javascript对象

时间:2013-10-23 15:48:27

标签: c# javascript asp.net-mvc json razor

我是C#开发人员和Javascript中的newbi。 我有一个C#对象,最后,在index.cshtml中,我可以通过调用Json.Encode(obj)来获取从对象转换的字符串

字符串是:

[
    {
    "Name":"CASE_A",
    "Values":[99.8,99.9,99.9,99.8,99.8,96.3,22.3]
    },
    {
    "Name":"CASE_B",
    "Values":[99.8,99.8,99.8,96.3,22.3]
    },
]

但是,当我调用JSON.parse(@TheString)时,我得到了:

Uncaught SyntaxError: Unexpected token & 

此错误的位置向我显示:

data = JSON.parse([{"Name":"CASE_A","Values":[99.8,99.9,99.9,99.8 ....

如何解决此问题?


谢谢你的答案! 但我仍然有一个错误:

Uncaught SyntaxError: Unexpected token o

对于简单的测试,我使用了这个:

@{
    string tmp = "[{\"Name\":\"CASE_A\",\"Values\":[99.8,99.9,98.6]},{\"Name\":\"CASE_B\",\"Values\":[96.7,11.1]}]";
}
var data1 = JSON.parse(@Html.Raw(@tmp));

来源显示这一行:

var data1 = JSON.parse([{"Name":"CASE_A","Values":[99.8,99.9,98.6]},{"Name":"CASE_B","Values":[96.7,11.1]}]);

我在这里看不到任何“o”。


此外,为了制作javascript对象,Travis建议在序列化之前删除密钥名称。但在C#中,所有对象都必须具有其成员名称。我能想到的只是字符串操作。有没有更好的方法呢?

6 个答案:

答案 0 :(得分:16)

Razor会自动为您转义HTML实体,以帮助您。您可以使用Html.Raw禁用此功能:

JSON.parse(@Html.Raw(TheString))

答案 1 :(得分:3)

您可以尝试使用 HtmlHelper.Raw method : -

data = JSON.parse(@Html.Raw(TheString));

另请查看 DataContractJsonSerializer Class

  

将对象序列化为JavaScript Object Notation(JSON)和   将JSON数据反序列化为对象。这个类不能被继承。

答案 2 :(得分:3)

对于第二个错误,JSON.parse需要一个字符串,但是你传入一个数组。您输出的js代码必须看起来像这样:

var data1 = JSON.parse("[{\"Name\":\"CASE_A\",\"Values\":[99.8,99.9,98.6]},{\"Name\":\"CASE_B\",\"Values\":[96.7,11.1]}]");

我还想注意,因为您将此对象注入到服务器端的javascript代码中,所以根本不需要调用JSON.parse。只要您将格式正确的javascript发送到将被评估和运行的客户端,那么它在服务器上的创建方式无关紧要。试试这个:

var data1 = @Html.Raw(@tmp);

答案 3 :(得分:1)

使用该字符串将导致Razor保护您免受注射。如果你在json传球,那么这不是问题。通常的做法是使用Html.Raw助手

data = JSON.parse( @(Html.Raw(TheString)) );

答案 4 :(得分:0)

OP的解决方案也适用于我。

data = eval(JSON.parse(@Html.Raw(TheString)))

答案 5 :(得分:0)

如果您有C#Object,并且想按原样在JavaScript中使用它,则可以执行以下操作:

var jsObject = @Html.Raw(JsonConvert.SerializeObject(TheString));

您需要添加nuget package并将dll导入_ViewImports.cshtml中:

@using Newtonsoft.Json;

希望它可以帮助某人...