【问题标题】:Weird JSON Javascript problem in RailsRails 中奇怪的 JSON Javascript 问题
【发布时间】:2011-08-23 15:32:25
【问题描述】:

我正在尝试将我的 JSON 从我的控制器获取到我的视图。在我的控制器中我正在做:

@nodes = Node.all
@json = @nodes.as_json(:only => [:ID, :Lat, :Lon]) 

在我看来我已经尝试过:

1) var stuff = <%= @json %>
2) var stuff = <%= @json.to_json %>
3) var stuff = <%= @json.to_json.to_json %>

所有这些都给我一个错误。我通常会收到"Unexpected Syntax Error &amp;" or "Unexpected Syntax Error {"

我也尝试过在控制器中使用 jquery 和 respond_to,但这似乎也不起作用。

我的想法是让 json 进入视图应该不是什么大问题,也不应该需要 jQuery,目前,我的页面源代码如下所示:

var stuff = [{&quot;node&quot;:{&quot;ID&quot;:1301499692582,&quot;Lat&quot;:42.3605063113369,&quot;Lon&quot;:-71.0870862191138}},{&quot;node&quot;:{&quot;ID&quot;:1301499691515,&quot;Lat&quot;:42.3605147089149,&quot;Lon&quot;:-71.0870533282532}},{&quot;node&quot;:{&quot;ID&quot;:1301431075499,&quot;Lat&quot;:42.3605456103,&quot;Lon&quot;:-71.0875239075536}} etc

我不理解 &quot 符号(也许这就是语法错误的来源)但是当我渲染 :json =&gt; @nodes.to_json 时,页面会渲染一个正常的有效 json:

[{"node":{"ID":1301499692582,"Lat":42.3605063113369,"Lon":-71.0870862191138}},{"node":{"ID":1301499691515,"Lat":42.3605147089149,"Lon":-71.0870533282532}},{"node":{"ID":1301431075499,"Lat":42.3605456103,"Lon":-71.0875239075536}}

注意:我也尝试过var stuff = '&lt;%= @json.to_json %>,但是当我做var json = JSON.parse(stuff) 时,它给了我一个非法令牌错误。

有人可以帮我解决这个问题吗?非常感谢!

【问题讨论】:

    标签: javascript ruby-on-rails ruby json


    【解决方案1】:

    这是 Rails 对您的字符串进行 html 编码的方式,这是 Rails 3 中的默认设置。

    您需要将您的 JSON 标记为 html_safe:

    var stuff = <%= @json.to_s.html_safe %>
    

    请注意,.to_s 是必需的,因为as_json 提供的是哈希而不是字符串。你可以这样做:

    # in controller
    @json = @nodes.to_json(:only => [:ID, :Lat, :Lon]) 
    
    #and in view
    var stuff = <%= @json.html_safe %>
    

    【讨论】:

    • 非常感谢!现在它按原样显示在源代码中。如果您不介意,能否举个例子说明如何访问 JSON 中的每个对象?我真的很感激!
    • 不错!抱歉,我没能早点回复。
    • 如果@json 包含不受信任的数据,这不是不安全吗?还是to_json 能正确逃离危险的东西?
    • to_json 应该输出有效的 JSON,这意味着任何 Rails 变量将是 integer 或正确引用的 string(或由它们组成的数组/对象),没有自动可执行的 JS代码。从理论上讲,这意味着代码注入是不可能的(直到你开始盲目地eval-ing JSON)。
    • 谢谢!正如@Sid 所说(使用Rails 4/5),您需要使用 .to_json.html_safe ... to_s 使用 key => value 而不是 key:value
    【解决方案2】:

    我认为你需要在它周围加上引号,然后你可以让 jquery 将字符串解析为 JSON。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多