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

9
我是一名C#开发者,对Javascript还是新手。 我有一个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#中,所有对象都必须有其成员名称。我能想到的唯一方法是字符串操作。有更好的方法吗?


理想情况下,如果我可以获得没有键名的JavaScript对象,那将会更好。例如,[[CASE_A,[[99.8,99.9,99.9,99.8,99.8,96.3,22.3],...]] - Daebarkee
1
这应该在序列化之前完成。 - Travis J
1
我实际上没有解决这个错误,因为另一个错误:"Uncaught SyntaxError: Unexpected token o"。但是我没有使用JSON对象,而是使用了JavaScript对象,并且使用了"data= eval(@Html.Raw(TheString))"。这很成功。 - Daebarkee
6个回答

21

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

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

谢谢p.s.w.g。我在Rahul和你之间犹豫不决,但似乎更多人喜欢你的清晰回答。 - Daebarkee
@Daebarkee 谢谢,但请记住,通常应接受您认为最完整回答了您的问题或解决了您的问题的答案,而不一定是最受欢迎的答案。另请参阅当答案被“接受”时意味着什么? - p.s.w.g

6

对于你的第二个错误,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

您可以使用HtmlHelper.Raw方法尝试此操作:-

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

同时也请查看DataContractJsonSerializer类

将对象序列化为JavaScript Object Notation(JSON),并将JSON数据反序列化为对象。此类无法继承。


谢谢你,Rahul。但我仍然有一个问题。请查看更新的问题。 - Daebarkee

1
使用字符串将使Razor保护您免受注入攻击。如果您传递的是json,则可能不是问题。常见做法是使用Html.Raw助手。
data = JSON.parse( @(Html.Raw(TheString)) );

0

OP的解决方案对我也起作用了。

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

0

如果您有一个 C# 的 Object 并想要直接在 JavaScript 中使用它,可以这样做:

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

您需要添加nuget包并在_ViewImports.cshtml中导入dll

@using Newtonsoft.Json;

希望能对某人有所帮助...


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