杰森键带有“。”作为分隔符

时间:2018-11-27 21:32:36

标签: java json gson

我正在使用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 ...

2 个答案:

答案 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:好的,我真的很傻。有一个仅使用对象的函数,仅此而已...