Как разобрать JSON без POJO - PullRequest
1 голос
/ 22 апреля 2020

Это мой json:

{
"taggedEntries": {
    "user/f8cf24ef-4bd0-846f-a11a781ce81a/tag/TEST": [
        "20HQtzLrqRe8xz8tybYf2aS087xS92Zi_1719877dbea:8e4:6eb16f2b"
    ],
    "user/f8cf24ef-4bd0-846f-a11a781ce81a/tag/global.unsaved": [
        "360ebRQH+hi4mCv/YibdkukUtv175h4JfU23PTw2O8M=_171888f776b:69cb:f8e58482",
        "20HQtzL4prqRe8xz8tybYf2aS087xS92Zi+zuo=_171987c5e49:8ed:6eb16f2b",
        "20HQtzL4rqRe8xz8tybYf2aS087xS92Zi+zuo=_171987d5d3d:8ee:6eb16f2b",
        "20HQtzL4q9uNe8xz8tybYf2aS087xS92Zi+zuo=_1719854c09a:8bd:6eb16f2b"
    ],
    "user/f8cf24ef-4bd0-846f-a11a781ce81a/tag/286f1f46-911c-4bc2-4b028b0d7ed0": [
        "v1I7ZIsSoGZxr80NFebazQf2J2QviXCcdot3TOU=_1717e68bf58:fcd1:75b51987",
        "360ebRQH+hibdkukUtv175h4JfU23PTw2O8M=_171888f776b:69cb:f8e58482",
        "20HQtzL4q9uqRe8xz8tybYf2aS087xS92Zi+zuo=_171983b3399:8b7:6eb16f2b"
    ]
}
}

Как мне разобрать его? Я хотел бы получить следующую структуру

TaggedEntries<String, Array<String>>

где: 1 аргумент имя тега , 2 аргумента идентификатор идентификатора Имя тега является динамическим c строка. Я не могу получить как элемент c элемент json. structure

Есть идеи? Спасибо за помощь:)

Ответы [ 4 ]

1 голос
/ 22 апреля 2020

Выполните синтаксический анализ Map<String, Map<String, List<String>>>, затем позвоните get("taggedEntries"), чтобы получить значение Map<String, List<String>>, которое вы ищете.

0 голосов
/ 26 апреля 2020

Когда вам нужны какие-то особые вещи, вам может понадобиться какая-то особая ручная работа, и это не ракетостроение, на самом деле :) Например, используя крошечный JSON парсер https://github.com/anatolygudkov/green-jelly :

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;

    public class ParseMyJson {
        private static final String myJson = "{" +
                "\"taggedEntries\": {" +
                "\"user/f8cf24ef-4bd0-846f-a11a781ce81a/tag/TEST\": [" +
                "\"20HQtzLrqRe8xz8tybYf2aS087xS92Zi_1719877dbea:8e4:6eb16f2b\"]," +
                "\"user/f8cf24ef-4bd0-846f-a11a781ce81a/tag/global.unsaved\": [" +
                "\"360ebRQH+hi4mCv/YibdkukUtv175h4JfU23PTw2O8M=_171888f776b:69cb:f8e58482\"," +
                "\"20HQtzL4prqRe8xz8tybYf2aS087xS92Zi+zuo=_171987c5e49:8ed:6eb16f2b\"," +
                "\"20HQtzL4rqRe8xz8tybYf2aS087xS92Zi+zuo=_171987d5d3d:8ee:6eb16f2b\"," +
                "\"20HQtzL4q9uNe8xz8tybYf2aS087xS92Zi+zuo=_1719854c09a:8bd:6eb16f2b\"" +
                "]," +
                "\"user/f8cf24ef-4bd0-846f-a11a781ce81a/tag/286f1f46-911c-4bc2-4b028b0d7ed0\": [" +
                "\"v1I7ZIsSoGZxr80NFebazQf2J2QviXCcdot3TOU=_1717e68bf58:fcd1:75b51987\"," +
                "\"360ebRQH+hibdkukUtv175h4JfU23PTw2O8M=_171888f776b:69cb:f8e58482\"," +
                "\"20HQtzL4q9uqRe8xz8tybYf2aS087xS92Zi+zuo=_171983b3399:8b7:6eb16f2b\"" +
                "]" +
                "}" +
                "}";

        public static void main(String[] args) {
            final TaggedEntries<String, String> result = new TaggedEntries<>();

            final JsonParser parser = new JsonParser();
            parser.setListener(
                    new JsonParserListenerAdaptor() {
                        private String lastPropertyName = null;
                        private boolean inArray = false;

                        public boolean onObjectMember(final CharSequence name) {
                            lastPropertyName = name.toString();
                            return true;
                        }

                        @Override
                        public boolean onArrayStarted() {
                            inArray = true;
                            result.onTag(lastPropertyName);
                            return true;
                        }

                        @Override
                        public boolean onArrayEnded() {
                            inArray = false;
                            return true;
                        }

                        @Override
                        public boolean onStringValue(final CharSequence data) {
                            if (inArray) {
                                result.onValue(data.toString());
                            }
                            return true;
                        }
                    }
            );
            parser.parse(myJson);
            parser.eoj();

            System.out.println(result);
        }

        public static class TaggedEntries<T, V> {
            private final Map<T, List<V>> allEntries = new HashMap();
            private List<V> currentTagValues;

            public TaggedEntries() {
            }

            public void onTag(final T tag) {
                currentTagValues = new ArrayList<>();
                allEntries.put(tag, currentTagValues);
            }

            public void onValue(final V value) {
                if (currentTagValues == null) {
                    throw new IllegalStateException("onTag must be called before");
                }
                currentTagValues.add(value);
            }

            public List<V> tagValues(final T tag) {
                return allEntries.get(tag);
            }

            public Set<T> tags() {
                return allEntries.keySet();
            }

            @Override
            public String toString() {
                final StringBuilder result = new StringBuilder("TaggedEntries{\n");
                allEntries.forEach((t, vs) -> {
                    result.append('\t').append(t).append('\n');
                    vs.forEach(v -> result.append("\t\t").append(v).append('\n'));
                });
                result.append('}');
                return result.toString();
            }
        }
    } 
0 голосов
/ 22 апреля 2020

Мое решение:

val obj = JsonParser().parse(jsonStr).asJsonObject.getAsJsonObject("taggedEntries") 
val entries = obj.entrySet() //will return members of your object
val data = mutableMapOf<String,ArrayList<String>>()
for ((key) in entries) {

    val ids: JsonArray = obj.getAsJsonArray(key)
    val listIdTags = arrayListOf<String>()
    ids.forEach{
        listIdTags.add(it.toString())
    }
    data.put(key,listIdTags)
}

// Print Data
data.forEach(){ key, value ->
    println("Key: $key")
    println("Value:")
    value.forEach{
        println( it)
    }
}

Возможно, есть лучшее решение, но я его не нашел. Если у вас есть решение, я бы хотел его услышать.

0 голосов
/ 22 апреля 2020

В вашем классе TaggedEntries у вас должен быть HashMap>. Я думаю, что ваш аргумент без POJO сложный или грязный, я думаю. Вы будете играть со многими JsonObject / JsonArray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...