Получить объект как JSON в IntelliJ Idea из отладчика

Можно ли получить весь объект из отладчика как Json? Есть вариант View text, а можно как-нибудь View JSON?

Какая жалость, что такая функциональность не является стандартной в IntelliJ IDEA :(

Honza Zidek 01.11.2021 20:51
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
36
1
21 780
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы можете использовать плагин Показать как ... для IntelliJ.

A small plugin to display formatted data out of the debugger and console.

Uses IntelliJ's build-in formatting capabilities. No more need to copy values from debugger or console to a file to format them there. Following formats are supported: JSON, SQL, XML, Base64 encoded JSON, Base64 encoded text

К сожалению, при отладке он работает некорректно, как указано в разделе комментариев плагина. Я попробовал себя безуспешно.

Rlarroque 20.09.2019 14:58

Как люди говорят в обзоре плагина и в нескольких комментариях здесь, на StackOverflow, этот плагин не работает (больше?). Какая жалость, что такая функциональность не является стандартной в IntelliJ IDEA :(

Honza Zidek 01.11.2021 20:50

В качестве альтернативы, как показано здесь, вы можете использовать следующий фрагмент кода в вашем наблюдателе отладки:

new ObjectMapper()
    .setSerializationInclusion(JsonInclude.Include.NON_NULL)
    .writerWithDefaultPrettyPrinter()
    .writeValueAsString( myObject )

Я считаю, что это не сработает для отладки GWT / на стороне клиента

Witold Kaczurba 30.04.2020 20:13

Просто следуйте ему: Файл | Настройки | Сборка, выполнение, развертывание | Отладчик | Просмотры данных | Средства визуализации типа Java, щелкните +, чтобы добавить новую визуализацию, копия в порядке :) вы можете выбрать другую банку для ее форматирования

А теперь, подай заявку, присоединяйся ~

Если у вас есть зависимость от gson в вашем проекте, вы можете создать контрольную переменную

new GsonBuilder().setPrettyPrinting().create().gson.toJson(myObject)

где myObject - ваш объект.

Ответ принят как подходящий

Обновлено: как отмечено в комментариях, это не идеально, так как для некоторых переменных вы получите ответ «stackoverflow»

Как предлагает @ Мистер Хан ответ, вот как это можно сделать:

Добавить новый способ просмотра объектов в отладчике Intellij как json от

  • Переход на File | Settings | Build, Execution, Deployment | Debugger | Data Views | Java Type Renderers
  • Щелкните +, чтобы добавить новое средство визуализации.
  • Назовите это JSON renderer
  • Поставка java.lang.Object для Apply renderer to objects of type
  • Выберите Use following expression: и введите такое выражение:
if (null == this || this instanceof String)
  return this;

new com.google.gson.GsonBuilder().setPrettyPrinting().create().toJson(this);
  • Нажмите OK
  • Теперь, когда вы выбираете Copy Value для переменной, она копируется как json.

Иногда для определенных объектов я получаю исключение StackOverflow или OutOfMemory. В остальном работает как шарм. Спасибо.

Dileepa 24.02.2020 10:18

Да, я вижу тот же @Dileepa - но я думаю, что это верно для любого такого подхода? Я попытался сделать исключения в коде и вернуть исходное "this", но это, похоже, не помогло.

Brad Parks 24.02.2020 13:25

Принятый ответ мне не подходит, но это работает. Кроме того, мне нравится, что это решение без плагинов. Просто редактируйте настройки, никаких проблем с загрузкой плагинов.

Nick Zafiridis 14.05.2020 11:28

Я хотел использовать встроенную функцию IntelliJ для таких задач, и этот ответ делает именно это. Слава богу, я не использую плагин для таких нужд.

MrKumar 01.10.2020 21:01

Я получаю значение JSON основного объекта, но все поля дочернего объекта пусты, а не копируются в JSON.

firstpostcommenter 26.05.2021 14:20

да, это не идеально - я больше не использую его, так как обнаружил, что переполнение стека слишком раздражает

Brad Parks 26.05.2021 15:14

Я получаю, что метод выбросил исключение java.lang.ClassNotFoundException.

dewijones92 02.12.2021 15:34

да, для этого решения требуется библиотека google gson, и вам может быть лучше использовать это решение, который основан на моем!

Brad Parks 02.12.2021 20:02

Следуйте инструкции @BradParks и используйте следующее выражение.

Для меня это не сработало без полностью определенных имен классов. Я также добавил некоторые модификации в ObjectMapper. По какой-то причине, которую я не понимаю, даже если у меня Apply renderers to object of type установлен на java.lang.Object, мне нужно было преобразовать this в (Object)this при использовании в качестве параметра метода writeValueAsString().

if (this == null 
|| this instanceof CharSequence 
|| this instanceof Number 
|| this instanceof Character 
|| this instanceof Boolean 
|| this instanceof Enum) {
// Here you may add more sophisticated test which types you want to exclude from the JSON conversion.
    return this;
}

new com.fasterxml.jackson.databind.ObjectMapper() 
        .registerModule(new com.fasterxml.jackson.datatype.jsr310.JavaTimeModule())
        .disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
        .setVisibility(
                com.fasterxml.jackson.annotation.PropertyAccessor.FIELD, 
                JsonAutoDetect.Visibility.ANY)
        .setSerializationInclusion(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)
        .writerWithDefaultPrettyPrinter()         
        .writeValueAsString((Object)this);

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