Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 10.10.2018
Сообщений: 63

Десериализация массива

30.04.2019, 13:38. Показов 3048. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравсвуйте!

Есть json:

JSON
1
2
3
4
5
6
 
{ "users":{
            "names": ["name1", "name2"]
 
}
        }
Есть кастомная дессериализация (om.fasterxml.jackson.databind.deser.std .StdDeserializer):
Java
1
2
3
4
5
6
7
8
9
@Override
    public List<String>deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException {
        JsonNode node = jsonParser.getCodec().readTree(jsonParser);
        if(node.get("users")!=null)
            node = node.get("users");
 
        return node.get("names") ?????;
    }
Как вернуть массив? asText, toString возвращают один элемент, как одну строку:
["name1", "name2"]
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.04.2019, 13:38
Ответы с готовыми решениями:

Десериализация json в объект java
Здравствуйте! Никак не могу решить проблему, подскажите, пожалуйста Если делаю вот так: ob =...

Десериализация xml в объект java
Доброго времени суток. Подскажите, пожалуйста. Есть такая структура xml: &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;...

Десериализация json в объект MultiValueMap
Здравствуйте, подскажите, пожалуйста. Хочу десериализовать header в MultiValueMap json(headerString): ...

6
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
30.04.2019, 14:35
Лучший ответ Сообщение было отмечено newComerJ как решение

Решение

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 String s = "{ \"users\":{\n" +
                "            \"names\": [\"name1\", \"name2\"]\n" +
                " \n" +
                "}\n" +
                "        }";
        JsonFactory factory = new JsonFactory();
        JsonParser parser = factory.createParser(s);
 
        while (!parser.isClosed()) {
            JsonToken jsonToken = parser.nextToken();
            if (JsonToken.START_ARRAY.equals(jsonToken)) {
                while (!JsonToken.END_ARRAY.equals(parser.nextToken())){
                    System.out.println(parser.getValueAsString());
                }
            }
        }
Добавлено через 22 минуты
вообще что-то типа этого можно попробовать или тупо свой ObjectMapper создай
Java
1
2
3
4
5
ObjectCodec oc = jsonParser.getCodec();
if (oc instanceof ObjectMapper) {
  ObjectReader reader =((ObjectMapper) oc).readerFor(new TypeReference<List<String>>() {});
  List<String> list = reader.readValue(json.findValue("names"));
}
0
25 / 21 / 6
Регистрация: 10.12.2018
Сообщений: 115
30.04.2019, 20:59
Вот написал небольшой гайд по json)
Java
1
2
3
4
5
6
7
/**
     * можно воспользоваться обжект маппером чтобы велосипед не изобретать
     * у json  есть ясный и понятный формат всё что в фигурных скобках - это объект
     * поля обозначаются так "names":name
     * массивы обозначаются квадратными скобками, итак давайте попробуем создать объект
     * Users и посмотрим что получится
     *
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.ArrayList;
 
public class Users {
 
    public ArrayList<String> getNames() {
        return names;
    }
 
    public void setNames(ArrayList<String> names) {
        this.names = names;
    }
 
    private ArrayList<String> names = new ArrayList<>();
}
теперь протестируем что получилось:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 @Test
    public void testJson() throws IOException {
        Users users = new Users();
        users.getNames().add("names1");
        users.getNames().add("names2");
        //выведем в консоль для наглядности
        System.out.println(new ObjectMapper().writeValueAsString(users));
        //оттестируем
        assertThat(new ObjectMapper().writeValueAsString(users), is("{\"names\":[\"names1\",\"names2\"]}"));
        //оттестируем в обратном направлении создадим объект из стринга
        Users usertest = new ObjectMapper().readValue("{\"names\":[\"names1\",\"names2\"]}", Users.class);
        assertThat(usertest.getNames().get(0), is("names1"));
        assertThat(usertest.getNames().get(1), is("names2"));
    }
Кликните здесь для просмотра всего текста
{"names":["names1","names2"]}

Java
1
2
3
4
5
6
 /**
     * и так мы разобрались как запихать массив {"names":["names1","names2"]} в объект
     * и как потом обратиться к элементам
     * но у нас же ещё есть users? {"users":{"names": ["name1", "name2"]}}
     * тут вообще проще некуда создаём класс и помещаем объект в юзерс в поле класса назавём этот класс маппером
     */
Java
1
2
3
4
5
6
7
8
9
10
11
public class Maper {
    private Users users;
 
    public Users getUsers() {
        return users;
    }
 
    public void setUsers(Users users) {
        this.users = users;
    }
}
тестируем что получилось:
Java
1
2
3
4
5
6
 @Test
    public void maperTest() throws IOException {
        Maper users1 = new ObjectMapper().readValue("{\"users\":{\"names\": [\"name1\", \"name2\"]" + "}" + "}", Maper.class);
        System.out.println(users1.getUsers().getNames()); //т.е. когда мы сказали getNames  мы дёнуи список [name1, name2]
        assertThat(users1.getUsers().getNames().toString(), is("[name1, name2]"));
    }
Кликните здесь для просмотра всего текста
[name1, name2]

Java
1
2
3
4
5
 /**
     * если ты спросишь что делать если у тебя большой подобный список через запятуюнапример:
     * [{"users":{"names":["name1","name2"]}},{"users":{"names":["name1","name2"]}}] и т.д.
     * то можно его также запихать
     */
Java
1
2
3
4
5
6
7
8
   @Test
    public void maperTestList() throws IOException {
        Maper[] maperList = new ObjectMapper().readValue("[{\"users\":{\"names\":[\"name1\",\"name2\"]}},{\"users\":{\"names\":[\"name3\",\"name4\"]}}]", Maper[].class);
        System.out.println(maperList[0].getUsers().getNames()); //т.е. дёрнули имена первого пользователя
        System.out.println(maperList[1].getUsers().getNames()); //т.е. дёрнули имена второго пользователя
        assertThat(maperList[0].getUsers().getNames().toString(), is("[name1, name2]"));
        assertThat(maperList[1].getUsers().getNames().toString(), is("[name3, name4]"));
    }
Кликните здесь для просмотра всего текста
[name1, name2]
[name3, name4]


Java
1
2
3
4
5
6
7
8
/**
     * подводим итог: создав два простых класса описанных выше
     * мы можем получить массив имён в одну строчку
     */
    @Test
    public void refMapper() throws IOException {
        System.out.println(new ObjectMapper().readValue("{\"users\":{\"names\":[\"name1\",\"name2\"]}}", Maper.class).getUsers().getNames());
    }
Кликните здесь для просмотра всего текста
[name1, name2]


поздравляю, теперь ты знаешь как работать с json
1
2 / 2 / 0
Регистрация: 10.10.2018
Сообщений: 63
07.05.2019, 16:19  [ТС]
JavaDoc, Спасибо! А если мне нужно сериализовать, десиарелизовать
JSON
1
"@type":"type"
Как работать с @ ?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
07.05.2019, 16:37
так же?
0
25 / 21 / 6
Регистрация: 10.12.2018
Сообщений: 115
07.05.2019, 19:47
Цитата Сообщение от newComerJ Посмотреть сообщение
"@type":"type"
вопрос не понял, для начало ты должен понять, если ты собрался парсить с помощью json то парсить всё подряд не получится , у json есть свой формат который он распознаёт
приведу пример: в фигурных скобках - это объект,
например: "@type":"type" - вот это json не поймёт
{"@type":"type"} - а вот это он распознает как объект с полем @type а значение у этого поля будет "type"
ты можешь создать класс как я приводил выше и дать имя полю @type но компилятор тебя должен послать т.к. начал ты имя поля с @ тут можно представить твой вариант как ключ значение приведу пример "@type" - это строковый ключ "type" - это строковое значение, под ключ -значение у нас подойдёт объект который мы все прекрасно знаем - это обычная хешмапа

Java
1
2
HashMap<String, String> mapa = new ObjectMapper().readValue("{\"@type\":\"type\"}", HashMap.class);
        System.out.println(mapa);
Кликните здесь для просмотра всего текста
{@type=type}


Добавлено через 10 минут
Java
1
2
3
4
5
6
  //или также без создания класов из твоего первого вороса можо было также воспользоваться мапой, 
        //но я думаю было бы не так понятно 
        HashMap<String, HashMap<String, ArrayList<String>>> mapa2 = new ObjectMapper().readValue("{\"users\":{\"names\":[\"name1\",\"name2\"]}}", HashMap.class);
        System.out.println(mapa2);
        //чисто имена
        System.out.println(mapa2.get("users").get("names"));
Кликните здесь для просмотра всего текста
{users={names=[name1, name2]}}
[name1, name2]

этот как вариант, но зачастую с объектами работать понятней
1
0 / 0 / 1
Регистрация: 08.02.2017
Сообщений: 18
13.05.2019, 23:59
Цитата Сообщение от newComerJ Посмотреть сообщение
Java
1
2
3
4
5
6
7
public List<String>deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
    throws IOException {
      JsonNode node = jsonParser.getCodec().readTree(jsonParser);
      if(node.get("users")!=null)
        node = node.get("users");
      return node.get("names") ?????;
    }
Как вернуть массив? asText, toString возвращают один элемент, как одну строку:
["name1", "name2"]
Что написал, то и возвращает. Попробуй что-то вроде этого:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public List<String>deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
    throws IOException {
       List<String> nameList = new ArrayList<>();
       JsonNode tree = jsonParser.getCodec().readTree(jsonParser);
       if(tree.get("users")!=null) {
         JsonNode users = tree.get("users");
         ArrayNode names = (ArrayNode) users.get("names");
         for(JsonNode node : names) {
            nameList.add(node.toString());
         }
       }
       return nameList;
  }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.05.2019, 23:59
Помогаю со студенческими работами здесь

Java Json Jackson десериализация дженерики
Хочу сделать так, чтоб этот метод «convertResponceInObjects» работал с разными объектами, но не получается Идея подсвечивает эту...

Java Json десериализация только нужных данных
Как мне содержимое которое находится в «Campaigns» положить как объект в массив? Желательно при помощи библиотеки jackson Json...

Десериализация .ser
Есть файл .ser, выдернутый из .jar архива. Есть варианты как просматреть в читаемом формате, что находется в .ser? Зарание спасибо.

Десериализация XML
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;response list=&quot;true&quot;&gt; &lt;user&gt; &lt;id&gt;205387401&lt;/id&gt; &lt;first_name&gt;Tom&lt;/first_name&gt; ...

Gson десериализация объекта в объекте
Всем привет, не могу сообразить как сделать... есть класс: public class Message { private String message; private int...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru