2016-07-14 65 views
1

我知道,對象的屬性不保證以任何特定順序存儲或讀取。在不改變順序的情況下瀏覽已存在的對象

我的問題是,它不取決於我使用的對象或數組。我已經有這樣一個大而且非常嵌套的JSON文件:

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

我只需要做一些修改。這就是我如何開始使用它:

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

當我做,我只是把它帶回:

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

現在,我注意到兩個問題的方法:

  1. 原始間隔格式丟失。該原始文件只是一個長行,需要一個長行,所以JSON庫的任何格式化嘗試都沒有幫助。我用幾個正則表達式替換解決了它。
  2. 現在「JSON行」文件已排序。所以我從{ "1": 0, "3": 0, "2": 0{ "1": 0, "2": 0, "3": 0,結果是一個大問題。
  3. 0結尾的浮點數被截斷。此文件需要浮點數始終有六位小數,例如,34.293800。但是當我打開它時,數字更改爲34.2938

這是一個35000字符的行。這是如何解決問題#2和#3?我可以做另一個正則表達式替換#3,但也許有一些我錯過了。

+1

您正在閱讀的json文件是由您創建的還是來自某處?如果它是由您創建的,我強烈建議更改其結構。如果任何地方的順序對你很重要,最好把它們放在數組中而不是對象屬性中。如果0對您很重要,請將這些數字保留爲字符串 – shinobi

+1

它表示它不在他身上。我看到的唯一選擇是將數據推入數組以保持順序,然後將其轉換回來。這不能純粹用JSON來完成,因爲每個JS引擎都以不同的方式對它進行排序。 http://stackoverflow.com/questions/8931967/how-to-deterministically-verify-that-a-json-object-hasnt-been-修改 – JSB

+1

對於這樣一個有限的用例,我會建議字符串操作,做一個子串搜索並找到密鑰及其值。然後替換/操作字符串。雖然這種方法效率低下,但考慮到您的限制...... –

回答

1

看問題和評論,它是字符串操作。 我不完全知道你想要用數據做什麼,但是,如果json使你的數據處理變得容易,你可以將兩者結合起來。

  1. 比方說你讀它作爲字符串,並在該點陣列中的使用你存儲在{ "1": 0, "3": 0, "2": 0...的1,3,2順序正則表達式,還你身邊需要保持0的號碼添加引號。
  2. 現在將此字符串轉換爲json。
  3. 處理數據
  4. 轉換回JSON字符串(轉換時,你在步驟1中的字符串創建回要求的格式{ "1": 0, "3": 0, "2": 0...你的陣列)

也可以看看這個問題 How to keep an Javascript object/array ordered while also maintaining key lookups?

希望有所幫助。祝一切順利!

+0

我正在進行字符串操作,基本上是純正則表達式。關於你的答案,解析/串化方法是什麼螺絲釘的順序......除非我正確地理解你,它會有同樣的問題。 –

+0

是的,但我要求你首先閱讀文本文件,然後從該文本(字符串)首先將訂單存儲在數組中的某個位置。然後你解析成json。儘管現在您將更改訂單,但數組中仍然有正確的順序。所以,當字符串回來時,你會從你的數組中選擇訂單。希望很明顯。 – shinobi

相關問題