2016-07-14 2 views
1

オブジェクトのプロパティは、特定の順序で格納または読み込まれることが保証されていません。注文を変更せずに既存のオブジェクトを移動する

問題は、オブジェクトまたは配列を使用するのは私自身の問題ではないということです。私はすでに次のように大きく大きく入れ子になったJSONファイルを持っています。

{ "occasion": 23, "mayorstips": { "1": 0, "3": 0, "2": 0... 

私はいくつかの変更が必要です。このアプローチに

fs.writeFileSync(theJSONFile, JSON.stringify(campaign)); 

さて、私が気づいた二つの問題:私は終わりだとき

var campaign = JSON.parse(fs.readFileSync(theJSONFile)); 
for(var plot in plots) { 
    if(plots.hasOwnProperty(plot)) { 
     switch(plots[plot].province) { 
      case 'forest': 
       ... 

、私はただでそれを戻す:これは、私はそれで作業を開始する方法です

  1. 元のスペーシング形式は失われています。元のファイルはの1つの長い行であり、1つの長い行である必要がありますので、JSONライブラリによる書式設定の試行は役に立ちませんでした。私はいくつかの正規表現の置き換えでそれを解決しました。
  2. 「JSONライン」ファイルは、にソートされました。だから私は{ "1": 0, "3": 0, "2": 0から{ "1": 0, "2": 0, "3": 0に行きました、そして、それは大きな問題であることが判明しました。
  3. で終わるフロート番号は、のように切り捨てられます。このファイルには、浮動小数点数が常に6桁の小数点以下を持つ必要があります。たとえば、34.293800です。しかし、私がそれを開くと、番号は34.2938に変わります!

35000文字の行です。それはどのように問題#2と#3を解決することができますか?私は#3のためにもう一つの正規表現を置き換えることができますが、おそらくそこには何かがありません。

+1

あなたが読んでいるjsonファイルは、あなたが作成したものか、どこかから取得していますか?あなたが作成した場合は、その構造を変更することを強くお勧めします。任意の場所で注文が問題になる場合は、オブジェクトのプロパティではなく配列に格納してください。 0があなたにとって重要な場合は、それらの数字を文字列に入れておきます。 – shinobi

+1

それは彼の責任ではないと言います。私が見る唯一のオプションは、配列を維持してからそれを元に戻すためにデータを配列にプッシュすることです。これは、各JSエンジンが別々にソートするので、JSONを使って完全に行うことはできません。 http://stackoverflow.com/questions/8931967/how-to-deterministically-verify-that-a-json-object-hasnt-been-modified – JSB

+1

このような制限付きのユースケースについては、私は文字列の操作をお勧めします部分文字列の検索を行い、キーとその値を見つけます。その後、文字列を置換/操作します。このアプローチは非効率ですが、あなたの制限を考えれば...... –

答えて

1

質問とコメントを見ると、文字列操作です。 データで何をしたいのか正確には分かりませんが、jsonがデータ処理を容易にする場合は、両方を組み合わせることができます。

  1. また、あなたが0のを維持するために必要な数字の前後に引用符を追加し、あなたは配列に{ "1": 0, "3": 0, "2": 0...に1,3,2の順序を保存する正規表現を使用して文字列としてこの時点でそれを読むと言うことができます。
  2. この文字列をjsonに変換します。
  3. プロセスデータ
  4. コンバートJSONバック文字列へ
  5. (あなたが文字列に必要な形式 { "1": 0, "3": 0, "2": 0...に戻って、ステップ1で作成した配列を変換しながら)

はまた、この問題 How to keep an Javascript object/array ordered while also maintaining key lookups?

を見て

希望に役立ちます。ではごきげんよう!

+0

私は文字列の操作、基本的に純粋な正規表現を進めています。あなたの答えに関して、parse/stringifyの方法論は、私があなたを正しく理解しない限り、同じ問題を抱えています。 –

+0

ええ、でも、テキストファイルとして読み込んでから、そのテキスト(文字列)から最初に配列のどこかに注文を保存するようにお願いしていました。その後、それをjsonに解析します。今度は注文を変更しても、あなたの配列にはまだ正しい順序があります。したがって、文字列を戻すときは、配列から注文を選択します。それがはっきりしていたと思う。 – shinobi

関連する問題