我正在使用JSON保存设置,并在重新启动后再次加载它们。但是现在我想使用“ category.subcategory.variable”之类的键来获取值。 我想像
boolean foo = json.get("category.subcategory.foo");
String bar = json.get("category.bar");
json.set("category.subcategory.baz", baz);
和json看起来像这样
{
category: {
subcategory: {
foo: false,
baz: ["baz"]
},
bar: "bar"
}
}
我也在使用Gson,也许在那里是可能的,但是如果只有另一个库,我可以考虑添加它。
我希望你们中的人比我了解更多,这是我第一次在Java中使用JSON ...
答案 0 :(得分:0)
我将执行类似的操作
public static String parse(String key,String json ){
String[] array=key.split("\\.");
JsonElement jsonElement = new JsonParser().parse(json);
String result=null;
JsonObject jobject=null;
String currentKey = null;
try{for(int i=0;i<array.length;i++){
currentKey=array[i];
JsonElement jelement = new JsonParser().parse(jsonElement.toString());
jobject = jelement.getAsJsonObject();
if(jobject.isJsonObject()&&!jobject.isJsonPrimitive()) {
jobject = jobject.getAsJsonObject(array[i]);}
else {
return jobject.get(array[i]).toString();
}
result=jobject.toString();
jsonElement=jobject;
}}catch(ClassCastException e) {
return jobject.get(currentKey).toString();
}
return result;
}
答案 1 :(得分:0)
我自己做的,为此我使用了JsonObject。我的测试有效,希望我不会发现任何错误。 因为我想用它来管理一些设置,所以我最初的JsonObject被称为“设置”。
JsonObject settings;
JsonObject defaultSettings;
static JsonElement getSetting(String key){
String[] args = key.split("\\.");
JsonObject curr = settings;
for(int i = 0; i < args.length - 1; i++){
curr = curr.getAsJsonObject(args[i]);
}
if(curr.has(args[args.length - 1]))
return curr.get(args[args.length - 1]);
else
return getGuildSetting(gId, key, defaultSettings);
}
static JsonElement getSetting(String key, JsonObject jsonObject){
String[] args = key.split("\\.");
JsonObject curr = jsonObject;
for(int i = 0; i < args.length - 1; i++){
curr = curr.getAsJsonObject(args[i]);
}
return curr.get(args[args.length - 1]);
}
static void setSetting(String key, Object val){
String[] args = key.split("\\.");
JsonElement emptyElement = new Gson().fromJson("{}", JsonElement.class);
JsonObject curr = settings;
for(int i = 0; i < args.length - 1; i++){
if(!curr.keySet().contains(args[i])) curr.add(args[i], emptyElement);
curr = curr.getAsJsonObject(args[i]);
}
curr.add(args[args.length - 1], new Gson().toJsonTree(val));
}
也许有更好的方法来测试它是否是数字,但似乎整数不是数字... 我尝试将对象本身转换为JsonElement,但这没有用。因此,只能使用数字,布尔值,字符串和字符,因为JsonObject可以使用这些函数。
编辑:好的,我很傻。代替使用val.getClass()== Number.class等,我可以使用val instanceof Number,这适用于所有类型的数字。这就是为什么我更改了代码。
编辑2:好的,我真的很傻。有一个仅使用对象的函数,仅此而已...