json解析器错误意外令牌

时间:2015-03-09 05:55:31

标签: ruby json

我正在获取一个json响应数组,如下所示。

"[{\"id\":\"23886\",\"item_type\":2,\"name\":\"Equalizer\",\"label\":null,\"desc\":null,\"genre\":null,\"show_name\":null,\"img\":\"http:\\/\\/httpg3.scdn.arkena.com\\/10242\\/v2_images\\/tf1\\/0\\/tf1_media_ingest95290_image\\/tf1_media_ingest95290_image_0_208x277.jpg\",\"url\":\"\\/films\\/media-23886-Equalizer.html\",\"duration\":\"2h27mn\",\"durationtime\":\"8865\",\"audio_languages\":null,\"prod\":null,\"year\":null,\"vf\":\"1\",\"vost\":\"1\",\"sd\":true,\"hd\":false,\"sdprice\":\"4.99\",\"hdprice\":null,\"sdfile\":null,\"hdfile\":null,\"sdbundle\":\"12771\",\"hdbundle\":\"12771\",\"teaser\":\"23887\",\"att_getter\":\"Tout le monde a le droit \\u00e0 la justice\",\"orig_prod\":null,\"director\":null,\"actors\":null,\"csa\":\"CSA_6\",\"season\":null,\"episode\":null,\"typeid\":\"1\",\"isfav\":false,\"viewersrating\":\"4.0\",\"criticsrating\":\"3.0\",\"onThisPf\":1},{\"id\":\"23998\",\"item_type\":2,\"name\":\"Le Labyrinthe\",\"label\":null,\"desc\":null,\"genre\":null,\"show_name\":null,\"img\":\"http:\\/\\/httpg3.scdn.arkena.com\\/10242\\/v2_images\\/tf1\\/1\\/tf1_media_ingest94727_image\\/tf1_media_ingest94727_image_1_208x277.jpg\",\"url\":\"\\/films\\/media-23998-Le_Labyrinthe.html\",\"duration\":\"1h48mn\",\"durationtime\":\"6533\",\"audio_languages\":null,\"prod\":null,\"year\":null,\"vf\":\"1\",\"vost\":\"1\",\"sd\":true,\"hd\":false,\"sdprice\":\"4.99\",\"hdprice\":null,\"sdfile\":null,\"hdfile\":null,\"sdbundle\":\"12699\",\"hdbundle\":\"12699\",\"teaser\":\"23999\",\"att_getter\":\"Saurez-vous r\\u00e9chapper du labyrinthe ?\",\"orig_prod\":null,\"director\":null,\"actors\":null,\"csa\":\"CSA_1\",\"season\":null,\"episode\":null,\"typeid\":\"1\",\"isfav\":false,\"viewersrating\":\"3.5\",\"criticsrating\":\"4.0\",\"onThisPf\":1},{\"id\":\"23688\",\"item_type\":2,\"name\":\"Gone Girl\",\"label\":null,\"desc\":null,\"genre\":null,\"show_name\":null,\"img\":\"http:\\/\\/httpg3.scdn.arkena.com\\/10242\\/v2_images\\/tf1\\/0\\/tf1_media_ingest92895_image\\/tf1_media_ingest92895_image_0_208x277.jpg\",\"url\":\"\\/films\\/media-23688-Gone_Girl.html\",\"duration\":\"2h22mn\",\"durationtime\":\"8579\",\"audio_languages\":null,\"prod\":null,\"year\":null,\"vf\":\"1\",\"vost\":\"1\",\"sd\":true,\"hd\":false,\"sdprice\":\"4.99\",\"hdprice\":null,\"sdfile\":null,\"hdfile\":null,\"sdbundle\":\"12507\",\"hdbundle\":\"12507\",\"teaser\":\"23689\",\"att_getter\":\"Il ne faut pas se fier aux apparences...\",\"orig_prod\":null,\"director\":null,\"actors\":null,\"csa\":\"CSA_2\",\"season\":null,\"episode\":null,\"typeid\":\"1\",\"isfav\":false,\"viewersrating\":\"4.0\",\"criticsrating\":\"4.5\",\"onThisPf\":1}]"

当我尝试解析它时,我得到了意外的令牌解析器错误,我认为这是由于响应开始和结束时的引号。

我错误地说解析器错误是由于响应开始和结束时的引号引起的。但我不确定为什么会这样。但是当我尝试解析json响应数组时,它确实会抛出错误。 知道json respnse数组中是否有任何错误。

3 个答案:

答案 0 :(得分:2)

  

我试图解析它但它会抛出解析器错误。我尝试如下   JSON.parse(File.read('演示'))。演示文件包含json   我粘贴的回复。

首先,你发布的json是一个ruby字符串。并且ruby将其解析为json而没有错误。但是,如果将该字符串粘贴到文件中,由于转义序列,它将无效json,其中最多的是\"

在ruby字符串中,序列\"(两个字符长)将转换为一个字符;在同一序列长度为两个字符的文件中:\"。换句话说,在ruby String中合法的转义序列在粘贴到文件时不代表相同的东西。

另一个例子:在ruby String中,转义序列\20AC是一个单一字符 - 欧元符号。但是,如果您将该序列粘贴到文件中,则该字符长度为五个字符:\20A,以及C

对评论的回应:

在json的开头有一个不可见的byte order mark(BOM),你可以通过执行来看到:

p resp

...产生输出:

\xEF\xBB\xBF[{\"id\":\"2388\" .....
  

BOM的UTF-8表示是字节序列   0xEF,为0xBB,为0xBF

     

字节顺序在UTF-8中没有意义,[4]因此它在UTF-8中的唯一用途是   在开始时发出信号,表示文本流以UTF-8编码。

您可以跳过前3个字节/字符,如下所示:

resp[3..-1]

答案 1 :(得分:1)

我在阅读JSON文件时遇到此错误,结果发现问题是JSON.parse不知何时不喜欢UTF-8编码的文件。当我第一次将文件编码为ASCII(= ISO 8859-1)时,一切都很顺利。

答案 2 :(得分:-1)

试试这个。它有效。

require 'json'
my_obj = JSON.parse("your json string", :symbolize_names => true)