Json ключ с "."в качестве разделителя - PullRequest
0 голосов
/ 28 ноября 2018

Я использую 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, возможно, это возможно, но если это возможно только с другой библиотекойЯ мог бы подумать о его добавлении.

Надеюсь, кто-то из вас знает больше меня, я впервые использую JSON в Java ...

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я сделал это сам и использую для этого 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: хорошо, я действительно тупой.есть функция, которая использует только объект и ничего более ...

0 голосов
/ 28 ноября 2018

Я бы реализовал что-то вроде:

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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...