Как мне изменить строку json в Java?

#java #json

#java #json

Вопрос:

У меня есть строка json, подобная

 {"egcnbrandcid":5555444433332220,"egcstatus":"CARD NOT ON EGC DATABASE","egcbalance":0.00}
  

Как я могу безопасно изменить строку в Java?

Под безопасным я подразумеваю, что мне все еще нужна действительная строка json после того, как я закончу ее изменять. В этом случае я бы преобразовал число в строку с выводом, выглядящим как:

 {"egcnbrandcid":"redacted","egcstatus":"CARD NOT ON EGC DATABASE","egcbalance":0.00}  
  

Важно отметить, что строка Json не всегда будет содержать эти же поля.

Комментарии:

1. Что вы подразумеваете под «безопасно»?

Ответ №1:

Вы можете использовать JsonParser(), вам не нужно создавать объекты Java для сохранения, это работает как Map

  public static void main(String[] args) throws Exception  
    { 
        // parsing file "JSONExample.json" 
        Object obj = new JSONParser().parse(new FileReader("JSONExample.json")); 

        // typecasting obj to JSONObject 
        JSONObject jo = (JSONObject) obj; 

        // getting firstName and lastName 
        String firstName = (String) jo.get("firstName"); 
        String lastName = (String) jo.get("lastName"); 

        System.out.println(firstName); 
        System.out.println(lastName); 

        // getting age 
        long age = (long) jo.get("age"); 
        System.out.println(age); 

        // getting address 
        Map address = ((Map)jo.get("address")); 

        // iterating address Map 
        Iterator<Map.Entry> itr1 = address.entrySet().iterator(); 
        while (itr1.hasNext()) { 
            Map.Entry pair = itr1.next(); 
            System.out.println(pair.getKey()   " : "   pair.getValue()); 
        } 

        // getting phoneNumbers 
        JSONArray ja = (JSONArray) jo.get("phoneNumbers"); 

        // iterating phoneNumbers 
        Iterator itr2 = ja.iterator(); 

        while (itr2.hasNext())  
        { 
            itr1 = ((Map) itr2.next()).entrySet().iterator(); 
            while (itr1.hasNext()) { 
                Map.Entry pair = itr1.next(); 
                System.out.println(pair.getKey()   " : "   pair.getValue()); 
            } 
        } 
  

Ответ №2:

Вдохновленный ответом @Yiao Sun, я написал следующие рекурсивные функции

     private void modJO(JSONObject job){
    Iterator keys = job.keys();
    while(keys.hasNext()) {
        String currentKey = (String)keys.next();
        JSONObject job2 = job.optJSONObject(currentKey);
        JSONArray jar = job.optJSONArray(currentKey);
        // If JSON Object
        if(job2 != null){
            modJO(job2);
        }
        // If JSON Array
        else if(jar != null){
            modJA(jar);
        }
        // If JSON Property
        else {
            if(currentKey.equals("cid")){
                try{
                    job.put(currentKey,"redacted");
                }
                catch(Exception ex){}
            }
        }
    }
}

private void modJA(JSONArray jar){
    for(int i = 0; i < jar.length(); i  ){
        JSONObject job = jar.optJSONObject(i);
        JSONArray jar2 = jar.optJSONArray(i);

        if (job != null){
            modJO(job);
        }
        else if (jar2 != null){
            modJA(jar2);
        }
    }
}
  

И я протестировал ее на этом объекте, который должен охватывать все возможные сценарии

 {
                notSecret: 'jetFuelCantMeltSteelBeams',
                cid: 'superSecret',
                obj: { cid: 'moreSecret' },
                objObj: { child: { cid: 'itsASecretToEverybody' } },
                array: [1, 2, 3],
                objArr: [{ cid: 'topSecret' }, { cid: 'iCantBelieveItsSecret' }],
                arrArr: [[1, 2], [1, 2]],
                mixed: [
                    { name: 'Waldo' },
                    { cid: 'unbelievablySecret' },
                    7,
                    [{ name: 'HeisenBurg' }, 9]
                ],
                emptyObj: {},
                emptyArr: []
            }  
  

Конечный результат

 {
                objObj: { child: { cid: 'redacted' } },
                arrArr: [[1, 2], [1, 2]],
                emptyArr: [],
                array: [1, 2, 3],
                obj: { cid: 'redacted' },
                objArr: [{ cid: 'redacted' }, { cid: 'redacted' }],
                mixed: [{ name: 'Waldo' }, { cid: 'redacted' }, 7, [{ name: 'HeisenBurg' }, 9]],
                emptyObj: {},
                notSecret: 'jetFuelCantMeltSteelBeams',
                cid: 'redacted'
            }
  

Вот как я это назвал

     private String modifyJsonObject(String jsonString){
    String json = "{"notSecret": "jetFuelCantMeltSteelBeams","cid": "superSecret","obj": { "cid": "moreSecret" },"objObj": { "child": { "cid": "itsASecretToEverybody" } },"array": [1, 2, 3],"objArr": [{ "cid": "topSecret" }, { "cid": "iCantBelieveItsSecret" }], "arrArr": [[1, 2], [1, 2]],"mixed": [{ "name": "Waldo" },{ "cid": "unbelievablySecret" },7,[{ "name": "HeisenBurg" }, 9]],"emptyObj": {},"emptyArr": []}";
    try {
        JSONObject jObject  = new JSONObject(json);
        modJO(jObject);
        return jObject.toString();
    }
    catch(Exception ex){
        int stop  = 4;
    }
    return "";
}