Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Модератор
Эксперт Java
 Аватар для alecss131
2867 / 1373 / 409
Регистрация: 11.08.2017
Сообщений: 4,399
Записей в блоге: 2

Парсинг json, проблема с хранением

11.06.2019, 18:11. Показов 2952. Ответов 13

Студворк — интернет-сервис помощи студентам
Здравствуйте, я новичок в java и прошу не кидаться тапками.
Пишу программу которая активно использует json (больше готовые, надо много парсить). Остановил выбор на гугловской бибилиотеке. С самой библиотекой проблем нету. Но возникла ошибка при чтении. Как обнаружил потом что проблема с записью в переменную, так как если вывод сделать на экран то проблем нету.
Структура json файла такая: {{a:a}, [{b:b}, {c:c}, ..., {z:z}]}, немного утрировал , но общий вид такой. Сколько элементов в массиве неизвестно и каждый раз разное.
В идеале мне надо чтобы работало так, передал имя файла получил на выходе структуру со всеми данными.
Вот мои наработки, главный класс (код на другом компе, к нему пока нету доступа, пока в общих чертах):
Java
1
2
3
4
5
6
7
8
9
10
11
12
class parse{
String a;
mas ma[];
parse read(String file){
parse out = new parse();
//код чтения json с регистрацией своего десериализатора.
return out;
}
}
class mas{
String b;
}
Часть проблемного кода в десериализации
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
class converter{
...
parse deserialise(parse src, Type type, ...){
parse out=new parse();
...
out.ma=new mas[size]; // size читается чуть раньше в этой функции
...
for (int i=0; i<size; i++){
out.ma[i].b=data; // data читается из json, но без проблем выводится на экран, ругается на эту строку
}
return out;
}
}
И само использование в программе:
Java
1
2
parse p = new parse();
p = p.read("file.json");
Как выяснил погуглив ошибки во время присваивания значения массиву классов значения data.
Только как решить эту проблему не нашел. Если создать конструктор класса и ему передавать размер массива, то результат тот же.
Я думал не будет проблем с динамическим массивом классов внутри другого класса. Либо подскажите как можно иначе сохранить эти данные для последующей обработки.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.06.2019, 18:11
Ответы с готовыми решениями:

Парсинг JSON в JSON Linked Data с использованием Hydra Java
Есть веб страница, на которой пользователь заполняет поля, жмет на кнопку и затем данные отправляются на сервер. На сервере работает...

Проблема с хранением иконок в ресурсах
Не хочет Resource Editor сохранять в файле ресурсов иконки с глубиной цвета 24 бита - пишет 'invalid icon file'. Вот фигня! Можно ли это...

Парсинг JSON с short.pub посредством NewtonSoft.Json
Доброго времени суток. Имеется сокращалка сайтов short.pub, у которой есть API, который возвращает JSON, содержащий сокращённые ссылки...

13
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
11.06.2019, 19:00
а как вас тапками то не кидать? вы все "я начинающий, помогите мне многопоточный чат/соцсеть/ИИ написать, ни хрена не понимаю".
Даже вот как ты свой псевдокод написал уже о многом говорит -конвенция (не женевская!), слышал?
Цитата Сообщение от alecss131 Посмотреть сообщение
ругается на эту строку
как именно ругается, матом? пиши давай стек ошибки

доки Gson уже зачитаны до дыр?

Цитата Сообщение от alecss131 Посмотреть сообщение
чтобы работало так, передал имя файла получил на выходе структуру со всеми данными.
что в файле лежит?жсоны?
0
Модератор
Эксперт Java
 Аватар для alecss131
2867 / 1373 / 409
Регистрация: 11.08.2017
Сообщений: 4,399
Записей в блоге: 2
11.06.2019, 19:17  [ТС]
пишет нечто такое
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

Это у меня вторая функция использующая gson. Первая работает без ошибок, в ней нету динамического массива классов.
А вот тут проблема вышла. Тут скорее даже проблема не в библиотеке, а в том как правильно десереализованные данные сохранить.
Я в начале сообщения привел структуру json файла, считывает без проблем если вывод сделать на экран а не в память.

Опишу еще проблему как ее понял я.
Есть класс в который считываю данные из json, одна из переменных этого класса является динамическим массивом другого класса. При парсинге заполняется этот динамический массив. При этом заполнении ругается. Не получается создать массив переменного размера внутри класса из вне. Использование конструктора не помогает, так же ругается.

Цитата Сообщение от Welemir1 Посмотреть сообщение
что в файле лежит?жсоны?
Файл и есть сам json, который надо считать. Он известной структуры, за исключением размера массива.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
11.06.2019, 19:22
Цитата Сообщение от alecss131 Посмотреть сообщение
Тут скорее даже проблема не в библиотеке, а в том как правильно десереализованные данные сохранить.
прочти внимательно
Цитата Сообщение от alecss131 Посмотреть сообщение
java.lang.NullPointerException
Цитата Сообщение от alecss131 Посмотреть сообщение
NullPointerException
Цитата Сообщение от alecss131 Посмотреть сообщение
Null
нужен твой код конечно и вот золотая тема
0
Модератор
Эксперт Java
 Аватар для alecss131
2867 / 1373 / 409
Регистрация: 11.08.2017
Сообщений: 4,399
Записей в блоге: 2
11.06.2019, 20:15  [ТС]
Сейчас написал простейшую программу которая повторяет ошибку из большой программы.
вот скрины

первый вариант для меня предпочтительнее, так как при использовании конструктора мне не известен размер массива, размер массива узнается из метода внутри класса (которого здесь нету и который использует gson для заполнения своих переменных).
На скринах класс data класс который хранит данные из jsona, внутри него есть класс который используя gson заполняет переменные. В этом примере вырезал парсинг джейсона а код заполнения вынес отдельно.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
11.06.2019, 20:37
дебаггер изучи, конвенцию изучи.
ошибка из-за того, что в твоем массиве ничего нет (null) и ты это null дереференсишь
0
Модератор
Эксперт Java
 Аватар для alecss131
2867 / 1373 / 409
Регистрация: 11.08.2017
Сообщений: 4,399
Записей в блоге: 2
11.06.2019, 20:47  [ТС]
Я пытаюсь его инициализировать значениями. И как раз при присваивании значения ругается.
Лучше бы подсказали как подправить эту программу.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
11.06.2019, 21:58
Цитата Сообщение от alecss131 Посмотреть сообщение
Лучше бы подсказали как подправить эту программу.
я попробую еще раз!
1) ты не знаешь конвенции и рановато тебе жсоны парсить, раз не понимаешь простых вещей, например классы нужно с большой буквы называть
2) читаем что такое массив, что такое объект, что такое нуллпоинтер эксепшн
3) читаем что тебе пишут на форуме, что тебе пишет ИДЕ и много думаем

ИДЕ тебе прямо пишет, что в массиве по индексу i ничего нет , ибо объект не инициализирован
d.ma[i].in=i // в d.ma[i] нет объекта, там нулл, потому при обращении к переменной in падает исключение
1
Модератор
Эксперт Java
 Аватар для alecss131
2867 / 1373 / 409
Регистрация: 11.08.2017
Сообщений: 4,399
Записей в блоге: 2
11.06.2019, 22:20  [ТС]
конвекция конвекция и ни слова о том что такое и хде искать. если нету на русском то идите лесом, англ не понимаю без гугло переводчика.
как хочу так и называю что хочу, на функционал это не влияет
2. читал об этом, не вижу противоречий с моим кодом
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
11.06.2019, 22:35
Цитата Сообщение от alecss131 Посмотреть сообщение
конвекция конвекция и ни слова о том что такое и хде искать.
в любой книге по джава, даже в примерах кода, обрати внимания на именования переменных, классов и т.п.

Цитата Сообщение от alecss131 Посмотреть сообщение
если нету на русском то идите лесом, англ не понимаю без гугло переводчика.
тогда с программированием нужно сразу заканчивать

Цитата Сообщение от alecss131 Посмотреть сообщение
2. читал об этом, не вижу противоречий с моим кодом
ты прочитал что пишет тебе ИДЕ? понял и прочитал что такое нулл поинтер? понял и прочитал как инициализируются массивы объектов?

так что зря начал фыркать, в школе ведь тоже с 1 класса идут постепенно, а не сразу в 5 идут, потому что нужно освоить и понять то, что преподают в начальных, прежде чем идти в 5 класс. Я тебе даже конкретно указал какая ошибка и где.

Я могу тебе посоветовать прочесть главу о массивах в любой книге по джава, но вообще лучше всю книгу и с самого начала.
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
12.06.2019, 11:16
alecss131, когда ты инициализируешь массив ma = new mas2[size], ты заполнеяешь его значениями null, т.е. нельзя обратиться к полю какого-либо элемента, ибо все элементы равны null. Надо инициализировать не только массив, но и его элементы

Добавлено через 1 минуту
Ну и да, раз ты самостоятельно не в состоянии этого понять, особенно после того, как господа выше тебе это напрямую сказали, то тебе действительно стоит почитать какую-нибудь книжку по java, а также начать учить англецкий, ибо без этого никак
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
12.06.2019, 11:37
Собсна, вот так выглядит массив после инициализации
1
Модератор
Эксперт Java
 Аватар для alecss131
2867 / 1373 / 409
Регистрация: 11.08.2017
Сообщений: 4,399
Записей в блоге: 2
12.06.2019, 13:13  [ТС]
Проблему решил изменив код на следующий, с массивами типов string, int такого не было
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class test {
    public static void main(String[] args) {
        data d = new data();
        int size = 10;
        d.str = "test";
        d.setsize(size);
        for (int i=0; i<size; i++) {
            d.ma[i].in = i;
        }
    }
}
class data {
    String str;
    mas ma[];
    void setsize(int size) {
        this.ma = new mas[size];
        for (int i=0; i<size; i++) {
            ma[i] = new mas();
        }
    }
    class mas{
        int in;
    }
}
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
12.06.2019, 14:56
alecss131, массив объектов типа String тоже инициализируется нулями (null), но разница в том, что ты обращаешься именно к определённому объекту, если делаешь присваивание strings[i] = "asdas". Но когда ты обращаешься к массиву, который находится внутри неинициализированного объекта, будет вылетать NullPointerException. А int — эт примитив, поэтому массив типа int инициализируется не значениями null, а просто нулями (0)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.06.2019, 14:56
Помогаю со студенческими работами здесь

[Newtonsoft.Json] Парсинг JSON-ответа
Здравствуйте уважаемые участники сообщества &quot;CyberForum&quot; ! У меня возникла небольшая проблема. Я перелопатил кучу форумов и 15 страниц...

Парсинг json , переменные из json
Всем доброго времени суток, в общем столкнулся с проблемой в силу отсутствия достаточного колл-ва знаний по js, jquery, jsonp. ...

Парсинг JSON'а
Здравствуйте! Недавно я на php+msql и Eclipse пробовал этот пример с сайта...

Парсинг Json
Здравствуйте подcкажите как сделать: нужно данные из Json засунуть в массив, чтобы его дальше передавать по активностям. Json парсится в...

Парсинг Json
Привет, скажите плз как распарсить json...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru