2013-12-14 94 views
0

,所以我終於閱讀了多個JSON對象和數組的工作,在幫助(不能發佈,因爲聲譽...)但我遇到了一個問題..我似乎無法輸出我所做的更改(設置對象的值)。我只能輸出更改。不在我讀取的文件中設置更改,然後輸出包含更改的文件。Java Json - 閱讀文件,編輯文件值,然後保存新的編輯

而且我使用這個庫(請使用它,如果你想幫助):https://mega.co.nz/#!LIkQ1Lwa!Jz0S1zdgYHzcpxpd2spmXxhAxu564Wrp0dUChqnDARU

這裏是我的代碼。 (這可能是混亂的,但它適用於這種無聊的JSON Java的東西。)

try { 
       BufferedReader in = new BufferedReader(new InputStreamReader(ModBox.class.getResourceAsStream("/info/lynxaa/modbox/res/tunables.json"))); 

       String line; 
       String out = ""; 
       while ((line = in.readLine()) != null) { 
        out += line; 
       } 

       in.close(); 

       JsonObject object = JsonObject.readFrom(out); 
       JsonObject ssObj = object.get("tunables").asObject(); 
       JsonObject sssObj = ssObj.get("MP_GLOBAL").asObject(); 

       JsonArray array = null; 
       //Fields we want to modify 
       String[] arrayObjects = { 
         "CARMOD_SHOP_MULTIPLIER", 
         "CLOTHES_SHOP_MULTIPLIER", 
         "HAIRDO_SHOP_MULTIPLIER", 
         "TATTOO_SHOP_MULTIPLIER", 
         "WEAPONS_SHOP_MULTIPLIER", 
         "CARS_WEBSITE_MULTIPLIER", 
         "PLANES_WEBSITE_MULTIPLIER", 
         "HELIS_WEBSITE_MULTIPLIER", 
         "BOATS_WEBSITE_MULTIPLIER", 
         "BIKES_WEBSITE_MULTIPLIER", 
         "XP_MULTIPLIER", 
         "CASH_MULTIPLIER", 
         "MAX_CASH_GIFT_LIMIT", 
         "MAX_HEALTH_MULTIPLIER", 
         "MIN_HEALTH_MULTIPLIER", 
         "HEALTH_REGEN_RATE_MULTIPLIER", 
         "HEALTH_REGEN_MAX_MULTIPLIER", 
         "MAX_ARMOR_MULTIPLIER" 
       }; 

       final String DIR_ = System.getProperty("user.home") + File.separator + "Desktop" + File.separator + "MODBOX" + File.separator; 

       File output = new File(DIR_ + "gta_v_modbox_json" + new Random().nextInt(999) + ".json"); 
       output.getParentFile().mkdirs(); 
       output.createNewFile(); 

       if (output.exists()) { 
        textArea.append("Created MODBOX files: " + output.getAbsolutePath() + "\n"); 
       } 

       for (String objects : arrayObjects) { 
        array = sssObj.get(objects).asArray(); 
       } 

       if (array == null) { 
        textArea.append("Error! Json Array outputted null."); 
        return; 
       } 

       for (JsonValue value : array.values()) { 
        double mvalue = value.asObject().get("value").asDouble(); 

        for (String objss : arrayObjects) { 
         textArea.append(objss + ":" + mvalue + "\n"); 

         for (Component component : tabMain.getComponents()) { 
          if (component instanceof JTextField) { 
           JTextField field = ((JTextField) component); 

           if (field.getName() == objss) { 
            textArea.append("Found match for: " + field.getName()); 
            textArea.append("Setting value of: " + field.getName() + " to: " + Double.parseDouble(field.getText())); 
            value.asObject().add(objss, Double.parseDouble(field.getText())); 

            FileWriter fw = new FileWriter(output.getAbsoluteFile()); 
            BufferedWriter bw = new BufferedWriter(fw); 

            value.writeTo(bw); 
            bw.close(); 
            break; 
           } 
          } 
         } 
        } 
       } 

      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (NullPointerException e) { 
       e.printStackTrace(); 
      } 

而每一次我保存文件時,這得到輸出:

{ 「值」:1, 「XP_MULTIPLIER 「:100, 「CASH_MULTIPLIER」:50, 「MAX_HEALTH_MULTIPLIER」:10000, 「MIN_HEALTH_MULTIPLIER」:10000, 「HEALTH_REGEN_RATE_MULTIPLIER」:10, 「MAX_ARMOR_MULTIPLIER」:10000 }

而不是編輯我讀取的實際文件。

這裏找到: https://mega.co.nz/#!GMUC3ZqT!JsvNEG5FEKTMsIhlDJdNjHyH7714qH199WmcTxdVO-E

+0

爲什麼不使用jackson並使用它的ObjectMapper並且只能使用POJO。它會更簡單,除了傑克遜可以爲你做大部分文件處理。 –

+0

我完全不熟悉java的整個json,並且在嘗試4天后僅在4小時前正確工作。我多次嘗試傑克遜,它從來沒有爲我工作。你介意提供一個讀取對象和數組,設置值並保存的例子嗎? – Lynxaa

+0

我會在稍後提供 –

回答

0

如果您正在使用Maven(我強烈推薦),你必須把這個在你的pom.xml文件:

<dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.3.0</version> 
</dependency> 

這將添加傑克遜作爲一個依賴到您的項目和maven將處理下載並將其添加到構建路徑。

爲了序列一個目的是JSON需要創建一個ObjectMapper:

ObjectMapper mapper = new ObjectMapper(); 

然後使用它的方法writeValue,這需要文件/的OutputStream /寫入器作爲第一參數和作爲第二目的。

mapper.writeValue(myFile, myData); 

反序列化JSON回的對象,則使用readValue()方法,它接受作爲參數文件/的InputStream /閱讀器和對象類型。

對於〔實施例:

MyClass data = mapper.readValue(myFile, MyClass.class); 

如果要反序列化的集合(在這個例子中的列表),你可以使用

CollectionType ct = mapper.getTypeFactory().constructCollectionType(List.class,MyClass.class); 
List<MyClass> myList = mapper.readValue(myFile, ct); 

看地圖(HashMap的):

MapType mapType = objectMapper.getTypeFactory().constructMapType(HashMap.class, KeyClass.class, ValueClass.class); 
      final Map<KeyClass, ValueClass> data = objectMapper.readValue(myFile, mapType); 

陣列:

Data[] data = objectMapper.readValue(myFile, Data[].class); 

爲了修改您的數據,您可以使用簡單的setter/getters,然後再保存。

+0

感謝Svetlin Zarev的例子。我會稍後再回復。 – Lynxaa

+0

使用你的傑克遜工作方法沒有做任何事情,只是拋出左右錯誤。我會繼續用我的方式,並嘗試修復我自己寫的文件,我猜。 無論如何,謝謝。 – Lynxaa

+0

什麼錯誤? ,我在幾個項目中使用了傑克遜,並且從未遇到任何問題。 –