2011-07-20 19 views
0

我使用node.js来使用twitter流api。一切工作正常,除非我试图解析我回来的JSON。 这里是什么,我尝试解析一个例子:JSON.parse与twitter流api中的json不兼容

{ 
    "text": "NEWS Nº2559 (use google translator to read it): http://t.co/dF3ClUC", 
    "in_reply_to_user_id": null, 
    "in_reply_to_status_id": null, 
    "favorited": false, 
    "in_reply_to_status_id_str": null, 
    "id_str": "93748566299918337", 
    "in_reply_to_screen_name": null, 
    "in_reply_to_user_id_str": null, 
    "geo": null, 
    "source": "web", 
    "contributors": null, 
    "retweeted": false, 
    "retweet_count": 0, 
    "entities": { 
     "user_mentions": [], 
     "hashtags": [], 
     "urls": [ 
      { 
       "display_url": "luxatenealibros.blogspot.com/2011/07/lux-at…", 
       "indices": [ 
        48, 
        67 
       ], 
       "expanded_url": "http://luxatenealibros.blogspot.com/2011/07/lux-atenea-news-n2559-cinderella-fables.html", 
       "url": "http://t.co/dF3ClUC" 
      } 
     ] 
    }, 
    "place": null, 
    "coordinates": null, 
    "user": { 
     "favourites_count": 0, 
     "profile_sidebar_fill_color": "efefef", 
     "profile_image_url": "http://a0.twimg.com/profile_images/983835547/logo_LUX_ATENEA_WEBZINE_normal.JPG", 
     "default_profile_image": false, 
     "show_all_inline_media": false, 
     "geo_enabled": false, 
     "profile_background_tile": true, 
     "screen_name": "LUXATENEAWEBZIN", 
     "id_str": "112305851", 
     "profile_link_color": "009999", 
     "url": null, 
     "description": "LUX ATENEA WEBZINE\u000d\u000aREVISTA CULTURAL GÓTICA ATIS&NYD\u000d\u000a", 
     "follow_request_sent": null, 
     "statuses_count": 3027, 
     "verified": false, 
     "profile_sidebar_border_color": "eeeeee", 
     "time_zone": null, 
     "contributors_enabled": false, 
     "profile_use_background_image": true, 
     "location": "", 
     "is_translator": false, 
     "lang": "es", 
     "profile_background_image_url_https": "https://si0.twimg.com/images/themes/theme14/bg.gif", 
     "profile_background_color": "131516", 
     "protected": false, 
     "listed_count": 2, 
     "profile_background_image_url": "http://a1.twimg.com/images/themes/theme14/bg.gif", 
     "friends_count": 3, 
     "followers_count": 55, 
     "name": "LUX ATENEA WEBZINE", 
     "notifications": null, 
     "created_at": "Mon Feb 08 00:53:45 +0000 2010", 
     "id": 112305851, 
     "default_profile": false, 
     "following": null, 
     "utc_offset": null, 
     "profile_text_color": "333333", 
     "profile_image_url_https": "https://si0.twimg.com/profile_images/983835547/logo_LUX_ATENEA_WEBZINE_normal.JPG" 
    }, 
    "truncated": false, 
    "id": 93748566299918340, 
    "created_at": "Wed Jul 20 18:26:14 +0000 2011" 
} 

jsonlint.com告诉我,这是有效的JSON,但它不可能从node.js中解析它任何想法为什么?

回答

0

我发现这个问题,它来自user.description部分和字符\ u000d & \ u000a。 下面是我如何使它工作:

var test = '{"text": "NEWS Nº2559 (use google translator to read it): http://t.co/dF3ClUC","in_reply_to_user_id": null,"in_reply_to_status_id": null,"favorited": false,"in_reply_to_status_id_str": null,"id_str": "93748566299918337","in_reply_to_screen_name": null,"in_reply_to_user_id_str": null,"geo": null,"source": "web","contributors": null,"retweeted": false,"retweet_count": 0,"entities": {"user_mentions": [],"hashtags": [],"urls": [{"display_url": "luxatenealibros.blogspot.com/2011/07/lux-at…","indices": [48,67],"expanded_url": "http://luxatenealibros.blogspot.com/2011/07/lux-atenea-news-n2559-cinderella-fables.html","url": "http://t.co/dF3ClUC"}]},"place": null,"coordinates": null,"user": {"favourites_count": 0,"profile_sidebar_fill_color": "efefef","profile_image_url": "http://a0.twimg.com/profile_images/983835547/logo_LUX_ATENEA_WEBZINE_normal.JPG","default_profile_image": false,"show_all_inline_media": false,"geo_enabled": false,"profile_background_tile": true,"screen_name": "LUXATENEAWEBZIN","id_str": "112305851","profile_link_color": "009999","url": null,"description": "LUX ATENEA WEBZINE\u000d\u000aREVISTA CULTURAL GÓTICA ATIS&NYD\u000d\u000a","follow_request_sent": null,"statuses_count": 3027,"verified": false,"profile_sidebar_border_color": "eeeeee","time_zone": null,"contributors_enabled": false,"profile_use_background_image": true,"location": "","is_translator": false,"lang": "es","profile_background_image_url_https": "https://si0.twimg.com/images/themes/theme14/bg.gif","profile_background_color": "131516","protected": false,"listed_count": 2,"profile_background_image_url": "http://a1.twimg.com/images/themes/theme14/bg.gif","friends_count": 3,"followers_count": 55,"name": "LUX ATENEA WEBZINE","notifications": null,"created_at": "Mon Feb 08 00:53:45 +0000 2010","id": 112305851,"default_profile": false,"following": null,"utc_offset": null,"profile_text_color": "333333","profile_image_url_https": "https://si0.twimg.com/profile_images/983835547/logo_LUX_ATENEA_WEBZINE_normal.JPG"},"truncated": false,"id": 93748566299918340,"created_at": "Wed Jul 20 18:26:14 +0000 2011"}'; 

test = test.replace(/\n/g, ''); 
test = test.replace(/\r/g, ''); 

console.log(JSON.parse(test)); 
4

我注意到,

"id_str": "93748566299918337", 

"id":  93748566299918340, 

似乎是相同的数据的两个不同的表现,但数量形式似乎已失去了一些精度。

是否有可能由于ID号字符串正好对尾数的限制而导致JSON数字解析器检测到精度损失?

JSON实际上并没有为数字指定任何语义,也没有指定有损数字解析器的可能性,但实现可能会保留在他们无法表示的数字上。

例如只有一个可以使用bigint/bigdecimal表示的JSON解析器(如python的)可以用{ "foo": 1e500 }做一些合理的事情,而JavaScript JS解析器(表示使用其原生数字类型的数字)可能会将该数字转换为Infinity,这是不能通过JSON进行轮转。

RFC 4627第4节说

4个解析器

...实现可以设置号码的范围限制。

编辑:

其他线索,我注意到在

"text": "NEWS Nº2559 ...", 
      ^

其中包含非ASCII字符。如果您使用的Node.js和你没有指定正确的编码,打开一个文件时,JSON解析器可以被假定UTF-8,因为RFC 4627

3编码

JSON文本应编码在Unicode中。默认编码是UTF-8,编号为 。

并且如果您的文件不是UTF-8,那么可能会导致在UTF-8中无法使用的字节序列,该序列将不得不被解码器拒绝。