2017-01-13 4 views
1

Я пытаюсь прочитать строку JSON, который находится внутри <pre> элемента здесь:Как разобрать этот JSON с Node.js?

http://nlp.stanford.edu:8080/corenlp/process?input=hello%20world&outputFormat=json

Если я скопировать и вставить строку с помощью мыши, я могу JSON.parse() его. Но если я прочитаю его программно, я получаю сообщение об ошибке.

Вот мой код:

var request = require('request'); // to make POST requests 
var Entities = require('html-entities').AllHtmlEntities; // to decode the json string (i.e. get rid of nbsp and quot's) 
var fs = require('fs') 
// Set the headers 
var headers = { 
    'User-Agent': 'Super Agent/0.0.1', 
    'Content-Type': 'application/x-www-form-urlencoded' 
} 

// Configure the request 
var options = { 
    url: 'http://nlp.stanford.edu:8080/corenlp/process', 
    method: 'POST', 
    headers: headers, 
    form: { 
     'input': 'hello world', 
     'outputFormat': 'json' 
    } 
} 

// Start the request 
request(options, function(error, response, body) { 
    if (!error && response.statusCode == 200) { 
     // Print out the response body 
     console.log("body: " + body) 
     let cheerio = require('cheerio') 
     let $ = cheerio.load(body) 
     var inside = $('pre').text(); 
     inside = Entities.decode(inside.toString()); 
     //console.log("inside "+ inside); 
     var obj = JSON.parse(inside); 
     console.log(obj); 
    } 
}) 

Но я получаю следующее сообщение об ошибке:

undefined:2 
  "sentences": [ 
^ 

SyntaxError: Unexpected token   in JSON at position 2 
    at JSON.parse (<anonymous>) 

А вот отрывок из выходного звена, то есть то, что я хочу, чтобы разобрать в obj :

{ 
&nbsp;&nbsp;&quot;sentences&quot;: [ 
&nbsp;&nbsp;&nbsp;&nbsp;{ 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;index&quot;: &quot;0&quot;, 
... 
&nbsp;&nbsp;&nbsp;&nbsp;} 
&nbsp;&nbsp;] 
} 

Как я могу JSON.parse() такой строки?

Спасибо,

+0

@JaredSmith Спасибо, я уже пробовал, что он включен в мой код. Но я все еще не могу правильно разобрать. – jeff

+0

Как выглядит декодированная строка? 'JSON.parse' не должен заботиться о пробеле ... –

+0

Похоже на регулярную строку, когда я печатаю на консоли. Но в самом начале пространство перед '{' диагностируется как неожиданный токен. – jeff

ответ

2

Окончательный ответ

И выход и ошибка, которую вы указали представил на проблему, чтобы разобрать символ пробела сразу после открытия JSON кронштейном. Я предлагаю вам удалить все пробелы, которые не входят в кавычки.

Как следует:

var obj = JSON.parse(str.replace(/(\s+?(?={))|(^\s+)|(\r|\n)|((?=[\[:,])\s+)/gm,''));

Оригинал ответа

Я предлагаю вам удалить все пробелы.

Так, var obj = JSON.parse(inside.replace(/\s/g,'')); должен работать

Вот JSFiddle example

EDIT

лучше: var obj = JSON.parse(str.replace(/(\s+?(?={))|(^\s+)|(\r|\n)|((?=[\[:,])\s+)/gm,'')); оставит пробелы в кавычках, как они, так как "разобрать" имеет пробелы в своем значении

+0

Это заменит ** все ** пробелы ... включая те, что указаны в строковых значениях в json. –

+0

Я попытался с помощью 'inside = inside.replace (/ (\ r \ n | \ n | \ r)/gm," ");', который не работал. Однако это работает! В этом случае, похоже, удаление пробелов прекрасное, поскольку каждый элемент - это слово, которое не содержит пробела. Итак, спасибо .. :) – jeff

+0

@JaredSmith Спасибо за ваш комментарий. отредактировал мой ответ. – remdevtec

2

Проблема в том, что все &nbsp; s. Они представляют неразрывный пробел, U+00A0. К сожалению, JSON.parse (правильно) зажимает эти символы, потому что спецификация JSON, RFC 4627, обрабатывает только обычные пробелы (U+0020), вкладки и разрывы строк как пробелы.

Вы можете сделать хакерскую вещь, которая должна заменить каждый U+00A0U+0020, но это также повлияет на неразрывные пространства внутри строк, что не является идеальным.

Лучший способ обработки входных данных, подобных этому, - использовать библиотеку разбора JSON, более терпимую к другим типам символов пробелов.


Почему вы не являетесь running your own copy of CoreNLP?Я думаю, они не хотят, чтобы вы очищали свой сервер.

+0

OMG, я не знал, что они сделали обертку Node.js! Спасибо огромное! – jeff

Смежные вопросы