1

私は、次のようなオブジェクトの配列の JSON コードを受け取るスクリプトに取り組んでいます。

{
  "array":[
    { "id": 1, "text": "Some text" },
    { "id": 2, "text": "Some text" }
  ]
}

JSON::XS を使用してデコードし、結果の一部を除外します。この後、後で処理するために、個々のノードの JSON コードをキューに格納する必要があります。このキューに必要な形式も JSON であるため、各ノードに挿入する必要があるコードは次のようになります。

{ "id": 1, "text": "Some text" }

ただし、decode_jsonがノードをデコードした後は、各ノードのハッシュ参照だけが残ります。

print $json->{'array'}[0]; # Would print something like HASH(0x7ffa80c83270)

ハッシュ参照でencode_jsonを使用して元のJSONコードに似たものを取得できることはわかっていますが、結果のコードは元のコードとは異なり、UTF-8文字はすべて奇妙になり、多くの余分な処理のように見えます。このスクリプトが処理しなければならないデータの量。

デコードされた配列ノードから元の JSON コードを取得する方法はありますか? JSON::XS は、デコードされた後、元のチャンクをどこかに保持しますか?


編集

奇妙な UTF-8 文字については、画面上で奇妙に見えるだけです。

#!/usr/bin/perl

use utf8;
use JSON::XS;
binmode STDOUT, ":utf8";

$old_json = '{ "text": "Drag\u00f3n" }';
$json = decode_json($old_json);
print $json->{'text'}; # Dragón

$new_json = encode_json($json);
print $new_json; # {"text":"Dragón"}

$json = decode_json($new_json);
print $json->{'text'}; # Dragón
4

3 に答える 3

2

encode_jsonでデコードする前に元々持っていたものと同等の JSON を生成しますdecode_json。UTF-8 を使用してエンコードされた文字は、まったく変ではありません。

$ cat a.pl
use Encode   qw( encode_utf8 );
use JSON::XS qw( decode_json encode_json );

my $json = encode_utf8(qq!{"name":"\x{C9}ric" }!);
print($json, "\n");
print(encode_json(decode_json($json)), "\n");

$ perl a.pl | od -c
0000000   {   "   n   a   m   e   "   :   " 303 211   r   i   c   "    
0000020   }  \n   {   "   n   a   m   e   "   :   " 303 211   r   i   c
0000040   "   }  \n
0000043

元の JSON を保持するパーサーが必要な場合は、独自のパーサーを作成する必要があります。既存のものはそれをしません。

于 2012-09-28T00:06:56.067 に答える
0

いいえ、どこにもありません。「元の JSON」は要素ごとに保存されません。シングルパスでデコードされます。

于 2012-09-28T00:04:29.437 に答える
0

いいえ、これは不可能です。すべての JSON オブジェクトは、複数の同等の表現を持つことができます。

{ "key": "abc" }

{
  "key" : "abc" 
}

ほとんど同じです。

したがって、モジュールが提供する再エンコードされた JSON を使用するだけです。

  1. JSON::XS がチャンクをキャッシュしたとしても、それらを抽出することはカプセル化の違反になるため、モジュールがアップグレードされた場合に機能する保証はありません。しかもデザインが悪い。

  2. パフォーマンスは気にしないでください。モジュールは C でコーディングされているため、非常に優れたパフォーマンスを発揮します。またXS、パフォーマンスに偏執的である場合は、JSON ではなくバイナリ形式を使用するでしょう。また、Perl ではなく Fortran を使用することになります ;-)

  3. 同等のデータを同等のデータとして扱う必要があります。たとえプレゼンテーションが異なっていても。

  4. Unicode 文字が奇妙に見えても、正常に処理される場合、問題はありません。正しく処理されない場合は、正確なエンコーディングを指定する必要がある場合があります。

于 2012-09-28T00:04:47.780 に答える