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

Posted

技术标签:

【中文标题】将 C# 对象转换为 JSON 或 Javascript 对象【英文标题】:Convert C# object to JSON or Javascript object 【发布时间】:2013-11-02 00:13:00 【问题描述】:

我是一名 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# 中,所有对象都必须有其成员名称。我能想到的只是字符串操作。有没有更好的方法?

【问题讨论】:

理想情况下,如果我能获得没有 Key Name 的 javascipt 对象会更好。例如,[[CASE_A, [[99.8,99.9,99.9,99.8,99.8,96.3,22.3], ...] 这应该在您序列化之前完成 我实际上并没有弄清楚这个错误,因为另一个错误:“Uncaught SyntaxError: Unexpected token o”。但是我没有使用 json 对象,而是使用了 javascript 对象并使用了“data= eval(@Html.Raw(TheString))”。成功了。 【参考方案1】:

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

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

【讨论】:

谢谢 p.s.w.g.我想知道 Rahul 和你之间的关系,但似乎更多人喜欢你的明确回答。 @Daebarkee 谢谢,但请记住,您通常应该接受您认为最能完全回答您的问题或解决您的问题的答案,这不一定是最受欢迎的答案。另见What does it mean when an answer is "accepted"?【参考方案2】:

对于您的第二个错误,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 method 试试这个:-

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

还可以查看 DataContractJsonSerializer Class

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

【讨论】:

谢谢拉胡尔。但我仍然有一个问题。请查看更新后的问题。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

OP 的解决方案也对我有用。

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

【讨论】:

【参考方案6】:

如果你有一个 C# Object 并想在 JavaScript 中按原样使用它,你可以这样做:

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

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

@using Newtonsoft.Json;

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

【讨论】:

以上是关于将 C# 对象转换为 JSON 或 Javascript 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将弱类型 JSON 转换为 C# 可读对象

怎样用C#把JSON数据转换为list或数组

将 C# 对象转换为 Json 对象

将 JSON 字符串转换为 C# 对象

将 JSON 字符串转换为 C# 对象

如何将任何 JSON 对象转换为 C# 对象