【问题标题】:JSON::ParserError: 757: unexpected token at '{JSON::ParserError: 757: '{
【发布时间】:2015-05-16 19:29:22
【问题描述】:

当前哈希是

{\"report_name\"=>\"Study/Control: ABIRATERONE ACETATE - 20151413355\", \"left_mue_start_date\"=>\"02-26-2015\", \"left_mue_end_date\"=>\"03-19-2015\", \"right_mue_start_date\"=>\"02-26-2015\", \"right_mue_end_date\"=>\"03-19-2015\", \"report_formulary_id\"=>\",7581\", \"mue\"=>\"true\", \"mue_type\"=>\"study/control\", \"chain_id\"=>\"1\", \"left_mue_formulary_ids\"=>[\"7581\"], \"action\"=>\"create_report\", \"controller\"=>\"informatics\", \"user_id\"=>339}

现在我需要将其转换为适当的哈希,例如

{"report_name" => "Study/Control: ABIRATERONE ACETATE - 20151413355"}

所以我尝试使用 JSON.parse 来获取它,但我收到如下错误:

JSON::ParserError: 757: unexpected token at '{

所以如果有人知道,请帮助我。 我正在使用 Rails 3.2

【问题讨论】:

    标签: ruby-on-rails ruby json


    【解决方案1】:

    你所拥有的是一个打印为字符串的哈希。要将其转换为哈希,请使用eval

    ch = "{\"report_name\"=>\"Study/Control: ABIRATERONE ACETATE - 20151413355\", \"left_mue_start_date\"=>\"02-26-2015\", \"left_mue_end_date\"=>\"03-19-2015\", \"right_mue_start_date\"=>\"02-26-2015\", \"right_mue_end_date\"=>\"03-19-2015\", \"report_formulary_id\"=>\",7581\", \"mue\"=>\"true\", \"mue_type\"=>\"study/control\", \"chain_id\"=>\"1\", \"left_mue_formulary_ids\"=>[\"7581\"], \"action\"=>\"create_report\", \"controller\"=>\"informatics\", \"user_id\"=>339}"
    hash = eval(ch)
    # => {"report_name"=>"Study/Control: ABIRATERONE ACETATE - 20151413355", "left_mue_start_date"=>"02-26-2015", "left_mue_end_date"=>"03-19-2015", "right_mue_start_date"=>"02-26-2015", "right_mue_end_date"=>"03-19-2015", "report_formulary_id"=>",7581", "mue"=>"true", "mue_type"=>"study/control", "chain_id"=>"1", "left_mue_formulary_ids"=>["7581"], "action"=>"create_report", "controller"=>"informatics", "user_id"=>339} 
    

    PS:JSON 字符串应如下所示,这意味着您拥有的不是 JSON,因此您得到 JSON::ParserError 用于在非 JSON 字符串上使用 JSON.parse

    "{\"report_name\":\"Study/Control: ABIRATERONE ACETATE - 20151413355\",\"left_mue_start_date\":\"02-26-2015\",\"left_mue_end_date\":\"03-19-2015\",\"right_mue_start_date\":\"02-26-2015\",\"right_mue_end_date\":\"03-19-2015\",\"report_formulary_id\":\",7581\",\"mue\":\"true\",\"mue_type\":\"study/control\",\"chain_id\":\"1\",\"left_mue_formulary_ids\":[\"7581\"],\"action\":\"create_report\",\"controller\":\"informatics\",\"user_id\":339}" 
    

    【讨论】:

    • 请小心使用eval,因为它可能会根据您的哈希来自何处在您的系统中注入恶意代码
    • 确实如此。 eval 总是有风险的。
    【解决方案2】:

    上次我遇到这个问题的时候,因为我从包含BOM 的 API 获得的 json 文件

    UTF-8 BOM 是一个字节序列 (EF BB BF) What's different between UTF-8 and UTF-8 without BOM?

    在该字符串的开头,但您知道当我们从响应中获取字符串时,该部分不会显示或不可读。我尝试使用 Ruby JSON 来解析它,但我失败了,我遇到了与你相同的异常。当您收到 Json 响应时,只是对其他人的提醒。顺便说一句,当您在 javascript 中处理它时,这不会有问题,但在 Python 或 Ruby 语言中会出现问题。

    【讨论】:

    • 将文件从 UTF-8 BOM 更改为 UTF-8 为我解决了这个问题。
    【解决方案3】:

    我遇到了类似的问题,但在解析 \"\" 时失败了。这是关于使用 Pact.IO 的。我在这里提到它,因为这是在查找我遇到的错误时排名最高的 Google 结果。在我的情况下,解决方案是在我的 C# 应用程序中更改 POST 的主体,使其不使用空字符串,而是使用空字符串。基本上我在我的 HTTP 调用之前添加了这个。

    if (request.Method == HttpMethod.Post && request.Content!=null && request.Content.GetType()==typeof(StringContent) && request.Content.ReadAsStringAsync().Result == String.Empty)
      request.Content = new StringContent(null);
    

    【讨论】:

      【解决方案4】:

      为避免使用eval,您可以使用JSON.parse ch.gsub('=>', ':'),这样您将从HASH 中获得一个HASH,存储为STRING

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-03
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        • 1970-01-01
        • 2018-01-28
        • 2010-11-18
        • 1970-01-01
        相关资源
        最近更新 更多