#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 "";
}