2017-01-13 12 views
1

私はここ<pre>要素内でJSON文字列を読み込むしようとしている:Node.jsでこのJSONを解析するにはどうすればよいですか?

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

優れている:彼らがそうであるように、 "パース" は、その値にスペース

+0

これは、**すべての**空白を置き換えます。これには、JSONの文字列値を含むものも含まれます。 –

+0

私は 'inside = inside.replace(/(\ r \ n | \ n | \ r)/ gm、" ");'で動作しませんでした。しかし、これは動作します!この場合、すべての要素がスペースを含まない単語であるため、空白を削除するように見えます。だから、ありがとう.. :) – jeff

+0

@ JaredSmithご意見ありがとうございます。私の答えを編集しました。 – remdevtec

2
を持っているため var obj = JSON.parse(str.replace(/(\s+?(?={))|(^\s+)|(\r|\n)|((?=[\[:,])\s+)/gm,''));は、引用符の内側にスペースを残します

問題はすべて&nbsp;です。これらは、改行なしの空白文字、U+00A0を表します。残念ながら、RFC 4627のJSON仕様では、通常のスペース(U+0020)、タブ、および改行のみが空白として扱われるため、JSON.parse(正しく)はそれらの文字を突き詰めます。

U+00A0をすべてU+0020に置き換えることもできますが、これは文字列の中に改行されないスペースにも影響しますが、これは理想的ではありません。

このような入力データを処理する最善の方法は、他の種類の空白文字をより許容しやすいJSON解析ライブラリを使用することです。


なぜあなたはrunning your own copy of CoreNLPですか?私は彼らがあなたのサーバーを掻き立てることを望んでいないと思う。

+0

OMG、彼らはNode.jsラッパーを作ったのか分からなかった!どうもありがとうございます! – jeff

関連する問題