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

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

11.06.2019, 18:11. Показов 2862. Ответов 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
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
11.06.2019, 19:00
а как вас тапками то не кидать? вы все "я начинающий, помогите мне многопоточный чат/соцсеть/ИИ написать, ни хрена не понимаю".
Даже вот как ты свой псевдокод написал уже о многом говорит -конвенция (не женевская!), слышал?
Цитата Сообщение от alecss131 Посмотреть сообщение
ругается на эту строку
как именно ругается, матом? пиши давай стек ошибки

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

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

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

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

Цитата Сообщение от Welemir1 Посмотреть сообщение
что в файле лежит?жсоны?
Файл и есть сам json, который надо считать. Он известной структуры, за исключением размера массива.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
11.06.2019, 19:22
Цитата Сообщение от alecss131 Посмотреть сообщение
Тут скорее даже проблема не в библиотеке, а в том как правильно десереализованные данные сохранить.
прочти внимательно
Цитата Сообщение от alecss131 Посмотреть сообщение
java.lang.NullPointerException
Цитата Сообщение от alecss131 Посмотреть сообщение
NullPointerException
Цитата Сообщение от alecss131 Посмотреть сообщение
Null
нужен твой код конечно и вот золотая тема
0
Модератор
Эксперт Java
 Аватар для alecss131
2848 / 1356 / 404
Регистрация: 11.08.2017
Сообщений: 4,330
Записей в блоге: 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
2848 / 1356 / 404
Регистрация: 11.08.2017
Сообщений: 4,330
Записей в блоге: 2
11.06.2019, 20:47  [ТС]
Я пытаюсь его инициализировать значениями. И как раз при присваивании значения ругается.
Лучше бы подсказали как подправить эту программу.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
11.06.2019, 21:58
Цитата Сообщение от alecss131 Посмотреть сообщение
Лучше бы подсказали как подправить эту программу.
я попробую еще раз!
1) ты не знаешь конвенции и рановато тебе жсоны парсить, раз не понимаешь простых вещей, например классы нужно с большой буквы называть
2) читаем что такое массив, что такое объект, что такое нуллпоинтер эксепшн
3) читаем что тебе пишут на форуме, что тебе пишет ИДЕ и много думаем

ИДЕ тебе прямо пишет, что в массиве по индексу i ничего нет , ибо объект не инициализирован
d.ma[i].in=i // в d.ma[i] нет объекта, там нулл, потому при обращении к переменной in падает исключение
1
Модератор
Эксперт Java
 Аватар для alecss131
2848 / 1356 / 404
Регистрация: 11.08.2017
Сообщений: 4,330
Записей в блоге: 2
11.06.2019, 22:20  [ТС]
конвекция конвекция и ни слова о том что такое и хде искать. если нету на русском то идите лесом, англ не понимаю без гугло переводчика.
как хочу так и называю что хочу, на функционал это не влияет
2. читал об этом, не вижу противоречий с моим кодом
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 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
2848 / 1356 / 404
Регистрация: 11.08.2017
Сообщений: 4,330
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru