2017-06-29 20 views
0

私が持っているこのようになりますstring:あなたが見ることができるようにJSON.parse()JSON文字列を含む配列の最後のインデックスをデシリアライズに失敗

{"name":"Bob","age":20}###{"name":"Brian","age":12}###{"name":"Ryan","age":19}

、彼らJSONのような文字列が画定されています###によって

私のJSコードは次のようになります。

var data = <above string passed in from a function> 
var data_list = data.split('###');   //should return an array with 3 JSON strings 

は今、私は個別リットルそれらを解析しようとしていますIKEこの:

console.log(JSON.parse(data_list[0]))   // returns [object Object] 
console.log(JSON.parse(data_list[1]))   // returns [object Object] 

しかし、最後の1:

console.log(JSON.parse(data_list[2]))   // Fails    

エラー:

ALSO
Invalid JSON: <json>:28:1 Expected eof but found 
} 
^ in <eval> at line number 28 

: 私はdata_list配列から各indexの内容をプリントアウトし、有効なJSONはjsonlint.com

です
+4

は、最後の閉じ括弧の後に任意の(見えない)文字はありますか? JSON.string(data_list [2])、JSON.parse(data_list [2] .trim())) ' – Bergi

+0

@Bergi:これらの文字は' \ u0000 \ u0000 \ u0000 \ u0000'です。 。それらを取り除く最善の方法は何ですか? 'replace()'を使って? – summerNight

+1

'replace'、' trim'、 'slice(0、lastIndexOf)'はすべて有効なアプローチです。または、彼らがどこから来たのかを知り、それを生成したソースからそれらを削除します。 – Bergi

答えて

0

\u0000\u0000\u0000\u0000の代わりにreplace(/\0/g, '')を使用できました。これでJSONが有効になりました。ありがとうBergi!

0

プログラマが存在する場合のベーンは、引用符(single vs double)とどちらを使用するのかについては、ここでの問題はデータの整合性に関するものです。文字列の数字は引用符で囲まれていませんが、それでも問題ありません。有効なJSONです。これを参照してくださいdiscussion実際の問題は、データが末尾のヌル文字で汚染されているために発生します。添付の例のように単純な正規表現でデータを整理することができます。

var data = '{"name":"Bob","age":20}###{"name":"Brian","age":12}###{"name":"Ryan","age":19}\u0000\u0000\u0000\u0000'; 
 

 
var clean_data = data.replace(/\u0000/g,""); 
 

 
var data_list = clean_data.split('###'); 
 

 
console.log(JSON.parse(data_list[0]))  
 
console.log(JSON.parse(data_list[1]))  
 
console.log(JSON.parse(data_list[2]))

このdiscussion

一つは関係なく、ソースに有効なとしてデータを受け入れる前に注意する必要がある参照してください。 JSONに有害な1つ以上の文字(たとえばヌルまたは垂直タブ文字)を文字列に取得すると、データが破損します。そうでなければ、データが汚染されていると判断する必要があります。そのような文字の出現を置き換える正規表現は、データの正当性を保証するのに役立ちます。これらの文字がUnicodeで表現されるかエスケープコードで表現されるかは重要ではありません。重要な点は、そのような出現を空の文字列で置き換えることです。 hereを参照してください。

+0

まあ、私の場合、私はどこか他の場所からその文字列を取得します。上記のbergiのコメントは、私の正確な問題と関連しているので、文字列の末尾に '\ u0000 .... '文字があります。 – summerNight

+1

@summerNight:大丈夫です。最後に\ u0000文字のコードを整理しました。あなたの文字列とコードが実行されます。 – slevy1

0

このコードを試して、その文字列をJSONオブジェクトの配列に変換できます。

var array = []; 
var uniqueString = '[' + data.replaceAll('###', ', ') + ']'; 
array = JSON.parse(uniqueString); 

'array'はJSON解析オブジェクトの配列なので、このようなものを取得できるはずです。

配列[0] '{"name": "Bob", "age": 20}'

+0

文字列の最後に問題のある「\ u0000」文字はどうなりますか? – slevy1

0

あなたのデータ列をチェックしてくださいになります@Bergiが言ったように、それはいくつか目に見えない文字を有することができます。

私は既に次のように文字列を貼り付けて確認しています。

var sample = '{"name":"Bob","age":20}###{"name":"Brian","age":12}###{"name":"Ryan","age":19}'; 
var data_str = sample.split('###'); 
console.log(JSON.parse(data_str[0])); 
console.log(JSON.parse(data_str[1])); 
console.log(JSON.parse(data_str[2])); 

出力がコンソール上に存在していた::

Object {name: "Bob", age: 20} 
VM981:4 Object {name: "Brian", age: 12} 
VM981:5 Object {name: "Ryan", age: 19} 
関連する問題