Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Модератор
Эксперт Java
2693 / 1192 / 386
Регистрация: 11.08.2017
Сообщений: 3,677
Записей в блоге: 2
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, я новичок в 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2019, 18:11
Ответы с готовыми решениями:

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

Проблема с хранением иконок в ресурсах
Не хочет Resource Editor сохранять в файле ресурсов иконки с глубиной цвета 24 бита - пишет...

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

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

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

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

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

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

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

Цитата Сообщение от Welemir1 Посмотреть сообщение
что в файле лежит?жсоны?
Файл и есть сам json, который надо считать. Он известной структуры, за исключением размера массива.
0
Автоматизируй это!
Эксперт Python
7196 / 4687 / 1222
Регистрация: 30.03.2015
Сообщений: 13,367
Записей в блоге: 29
11.06.2019, 19:22 4
Цитата Сообщение от alecss131 Посмотреть сообщение
Тут скорее даже проблема не в библиотеке, а в том как правильно десереализованные данные сохранить.
прочти внимательно
Цитата Сообщение от alecss131 Посмотреть сообщение
java.lang.NullPointerException
Цитата Сообщение от alecss131 Посмотреть сообщение
NullPointerException
Цитата Сообщение от alecss131 Посмотреть сообщение
Null
нужен твой код конечно и вот золотая тема
0
Модератор
Эксперт Java
2693 / 1192 / 386
Регистрация: 11.08.2017
Сообщений: 3,677
Записей в блоге: 2
11.06.2019, 20:15  [ТС] 5
Сейчас написал простейшую программу которая повторяет ошибку из большой программы.
вот скрины
Парсинг json, проблема с хранением
Парсинг json, проблема с хранением

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

ИДЕ тебе прямо пишет, что в массиве по индексу i ничего нет , ибо объект не инициализирован
d.ma[i].in=i // в d.ma[i] нет объекта, там нулл, потому при обращении к переменной in падает исключение
1
Модератор
Эксперт Java
2693 / 1192 / 386
Регистрация: 11.08.2017
Сообщений: 3,677
Записей в блоге: 2
11.06.2019, 22:20  [ТС] 9
конвекция конвекция и ни слова о том что такое и хде искать. если нету на русском то идите лесом, англ не понимаю без гугло переводчика.
как хочу так и называю что хочу, на функционал это не влияет
2. читал об этом, не вижу противоречий с моим кодом
0
Автоматизируй это!
Эксперт Python
7196 / 4687 / 1222
Регистрация: 30.03.2015
Сообщений: 13,367
Записей в блоге: 29
11.06.2019, 22:35 10
Цитата Сообщение от alecss131 Посмотреть сообщение
конвекция конвекция и ни слова о том что такое и хде искать.
в любой книге по джава, даже в примерах кода, обрати внимания на именования переменных, классов и т.п.

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

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

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

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

Добавлено через 1 минуту
Ну и да, раз ты самостоятельно не в состоянии этого понять, особенно после того, как господа выше тебе это напрямую сказали, то тебе действительно стоит почитать какую-нибудь книжку по java, а также начать учить англецкий, ибо без этого никак
0
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,026
Записей в блоге: 2
12.06.2019, 11:37 12
Собсна, вот так выглядит массив после инициализации
Парсинг json, проблема с хранением
1
Модератор
Эксперт Java
2693 / 1192 / 386
Регистрация: 11.08.2017
Сообщений: 3,677
Записей в блоге: 2
12.06.2019, 13: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
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,026
Записей в блоге: 2
12.06.2019, 14:56 14
alecss131, массив объектов типа String тоже инициализируется нулями (null), но разница в том, что ты обращаешься именно к определённому объекту, если делаешь присваивание strings[i] = "asdas". Но когда ты обращаешься к массиву, который находится внутри неинициализированного объекта, будет вылетать NullPointerException. А int — эт примитив, поэтому массив типа int инициализируется не значениями null, а просто нулями (0)
0
12.06.2019, 14:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2019, 14:56
Помогаю со студенческими работами здесь

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

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

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

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

Парсинг JSON
Помогите спарсить url mp3 из json зайцев.нет...

Парсинг Json
Удается получить только update id не могу понять как получить остальные данные. Подскажите...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru