Могу ли я десериализовать json рекурсивным образом, включив родительский класс в дочерний класс?

У меня есть json что-то вроде

{
    "author":"jack",
    "comment_body":"any message body",
    "replies":{
        "author":"john",
        "comment_body":" reply body",
        "replies": {
            "author":"john",
        "comment_body":" reply body",
        "replies":{
            ...
        }
        }
    }
}

как я могу разобрать этот json, пока мои классы

class Comment {
private String author;
private String comment_body;
private Replies replies;
}

class Replies{
private Comment comment_tree;
}

Любая помощь о том, как анализировать ответ на комментарий в gson?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
141
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для этого вам понадобится отражение ... Но вам действительно стоит подумать об использовании существующей библиотеки, такой как Jackson, в которой есть ObjectMapper, который выполняет эту работу за вас.

Вот ссылка на основы использования Jackson для сериализации / десериализации объектов в JSON и обратно.

https://www.baeldung.com/jackson-object-mapper-tutorial

Надеюсь, это поможет!

На самом деле я хочу сделать это в gson

John McLane 16.10.2018 07:25

Тогда, возможно, этот ответ вам поможет. stackoverflow.com/questions/28391982/…

Tomaz Fernandes 16.10.2018 07:31

Там написано android, но это справедливо для любого java-приложения.

Tomaz Fernandes 16.10.2018 07:31

спасибо за помощь, но я не это ищу :)

John McLane 16.10.2018 08:02

Вам просто нужен класс комментария. Попробуй это:

class Comment {
    private String author;
    private String comment_body;
    private Comment replies;
}

Образец кода:

public class Main {

    public static void main(String[] args) {
        Comment comment = new Comment();
        comment.setAuthor("Outer Author");
        comment.setReplies(new Comment());
        comment.getReplies().setAuthor("Inner Author");

        System.out.println("Author 1 :"+comment.getAuthor());
        System.out.println("...Author 2 :"+comment.getReplies().getAuthor());
    }
}

class Comment {
    private String author;
    private String comment_body;
    private Comment replies;

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getComment_body() {
        return comment_body;
    }

    public void setComment_body(String comment_body) {
        this.comment_body = comment_body;
    }

    public Comment getReplies() {
        return replies;
    }

    public void setReplies(Comment replies) {
        this.replies = replies;
    }
}

Пример вывода:

Автор 1: Внешний Автор
... Автор 2: Внутренний автор

как я могу добавить ссылку на класс в том же классе ?? Я думаю это невозможно

John McLane 16.10.2018 07:25
Ответ принят как подходящий

Вам не нужен класс Replies. Это не соответствует вашему JSON. Здесь у вас есть один рекурсивный класс.

Прежде всего, вам нужно немного отредактировать свой JSON, например (добавлен null):

{
    "author": "Jack",
    "comment_body": "Any message body",
    "replies": {
        "author": "John",
        "comment_body": "Reply body",
        "replies": {
            "author": "Smith",
            "comment_body": "Another reply body",
            "replies": null
        }
    }
}

Затем создайте рекурсивную переменную в своем классе:

public class Comment {
    String author;
    String comment_body;
    Comment replies;

    @Override
    public String toString() {
        return "Comment{author='" + author + "', comment_body='" + comment_body + "', replies = " + replies + '}';
    }
}

Наконец, запускаемый класс:

import com.google.gson.Gson;

public class Main {
    public static void main (String[] args) {
        String json =   "{\n" +
                        "    \"author\": \"Jack\",\n" +
                        "    \"comment_body\": \"Any message body\",\n" +
                        "    \"replies\": {\n" +
                        "        \"author\": \"John\",\n" +
                        "        \"comment_body\": \"Reply body\",\n" +
                        "        \"replies\": {\n" +
                        "            \"author\": \"Smith\",\n" +
                        "            \"comment_body\": \"Another reply body\",\n" +
                        "            \"replies\": null\n" +
                        "        }\n" +
                        "    }\n" +
                        "}\n";
         Comment comment = new Gson().fromJson(json, Comment.class);
         System.out.println(comment);
    }
}

Выход:

Comment{author='Jack', comment_body='Any message body', replies=Comment{author='John', comment_body='Reply body', replies=Comment{author='Smith', comment_body='Another reply body', replies=null}}}

Можно ли использовать ту же ссылку на класс, которую вы использовали для ответа?

John McLane 17.10.2018 00:37

Конечно. private static class Node<E> внутри реализации java.util.LinkedList сделан таким же образом.

freeone31 17.10.2018 06:55

Эй, я использовал твой метод. Теперь у меня другая проблема. Есть ли способ вызвать десериализатор gson по умолчанию в JsonDeserializer?

John McLane 17.10.2018 10:05
Может это поможет
freeone31 17.10.2018 13:07

да. Я нашел такой же ответ

John McLane 18.10.2018 17:09

Другие вопросы по теме