Преобразование из json в объект Java
В таких случаях идете на этот прекрасный ресурс: http://www.jsonschema2pojo.org/ Создаете себе POJO для ваших классов :
public class Cast < @SerializedName("fullName") @Expose private String fullName; @SerializedName("role") @Expose private String role; public String getFullName() < return fullName; >public void setFullName(String fullName) < this.fullName = fullName; >public String getRole() < return role; >public void setRole(String role) < this.role = role; >> package com.example; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Director < @SerializedName("fullName") @Expose private String fullName; public String getFullName() < return fullName; >public void setFullName(String fullName) < this.fullName = fullName; >> package com.example; import java.util.List; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Movie < @SerializedName("name") @Expose private String name;@SerializedName("year") @Expose private Integer year; @SerializedName("description") @Expose private String description; @SerializedName("director") @Expose private Director director; @SerializedName("cast") @Expose private Listcast = null; public String getName() < return name; >public void setName(String name) < this.name = name; >public Integer getYear() < return year; >public void setYear(Integer year) < this.year = year; >public String getDescription() < return description; >public void setDescription(String description) < this.description = description; >public Director getDirector() < return director; >public void setDirector(Director director) < this.director = director; >public List getCast() < return cast; >public void setCast(List cast) < this.cast = cast; >> package com.example; import java.util.List; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Response < @SerializedName("movie") @Expose private Listmovie = null; public List getMovie() < return movie; >public void setMovie(List movie)
Ну и потом все просто (надеюсь у Вас добавлены все необходимые зависимости добавляющие Gson в Ваш проект)
Gson gson = new Gson(); Response response = gson.fromJson(yourJson, Response.class); List movies = response.getMovie();
Преобразование HashMap в JSON объект в Java
Часто при разработке приложений на Java возникает необходимость преобразовать данные, хранящиеся в коллекции типа HashMap, в формат JSON. Это может быть полезно при реализации обмена данными между клиентом и сервером, сохранении состояния приложения и т.д.
Например, представим, что есть HashMap, который хранит пары ключ-значение, где ключом является строка, а значением — число:
HashMap<String, Integer> map = new HashMap<>(); map.put("One", 1); map.put("Two", 2); map.put("Three", 3);
И задача состоит в том, чтобы преобразовать эту коллекцию в JSON объект, который затем можно преобразовать в строку JSON.
Решение
Для решения этой задачи можно использовать библиотеку Gson от Google, которая позволяет легко и быстро преобразовывать Java объекты в их JSON представление и обратно.
Сначала необходимо добавить зависимость от Gson в файл проекта. Для Maven это выглядит так:
<dependencies> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.6</version> </dependency> </dependencies>
Теперь можно преобразовать HashMap в JSON объект с помощью следующего кода:
Gson gson = new Gson(); String jsonString = gson.toJson(map);
В результате переменная jsonString будет содержать строку JSON, соответствующую исходному HashMap:
Обратное преобразование строки JSON в HashMap можно выполнить с помощью метода fromJson :
Type type = new TypeToken<HashMap<String, Integer>>()<>.getType(); HashMap<String, Integer> mapFromJson = gson.fromJson(jsonString, type);
Таким образом, с помощью библиотеки Gson можно легко преобразовывать HashMap в JSON объект и обратно в Java.
Как преобразовать Java-объект в / из JSON (Джексон)
В этом руководстве мы покажем вам, как использовать привязку данных Jackson 1.x для преобразования объекта Java в / из JSON.
Заметка
Jackson 1.x — это проект технического обслуживания, пожалуйста, используйте вместо него Jackson 2.x. Заметка
Этот учебник устарел, больше обновлений нет, пожалуйста, обратитесь к последнему учебнику по Jackson 2 — Объект в / из JSON .
1. Краткий справочник
1.1 Преобразовать объект Java в JSON, writeValue(. )
ObjectMapper mapper = new ObjectMapper(); User user = new User(); // Объект в формате JSON в файле mapper.writeValue(new File("c:\user.json"), user); // Объект в JSON в строке String jsonInString = mapper.writeValueAsString(user);
1.2 Конвертировать JSON в объект Java, readValue(. )
ObjectMapper mapper = new ObjectMapper(); String jsonInString = ""; // JSON из файла в объект User user = mapper.readValue(new File("c:\user.json"), User.class); // JSON из строки в объект User user = mapper.readValue(jsonInString, User.class);
PS Все примеры тестируются с Джексоном 1.9.13
2. Зависимость Джексона
Для Jackson 1.x он содержит 6 отдельных банок для разных целей, в большинстве случаев вам просто нужно jackson-mapper-asl ,
org.codehaus.jackson jackson-mapper-asl 1.9.13
3. POJO (простой старый объект Java)
Пользовательский объект для тестирования.
package com.csharpcoderr.json; import java.util.List; public class User < private String name; private int age; private Listmessages; // геттеры и сеттеры >
4. Объект Java в JSON
Конвертировать user Объект в строку формата JSON.
package com.csharpcoderr.json; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; public class JacksonExample < public static void main(String[] args) < ObjectMapper mapper = new ObjectMapper(); //Для тестирования User user = createDummyUser(); try < // Преобразовать объект в строку JSON и сохранить в файл напрямую mapper.writeValue(new File("D:\user.json"), user); // Преобразовать объект в строку JSON String jsonInString = mapper.writeValueAsString(user); System.out.println(jsonInString); // Конвертировать объект в строку JSON и красивую печать jsonInString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user); System.out.println(jsonInString); >catch (JsonGenerationException e) < e.printStackTrace(); >catch (JsonMappingException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >> private static User createDummyUser() < User user = new User(); user.setName("mkyong"); user.setAge(33); Listmsg = new ArrayList<>(); msg.add("hello jackson 1"); msg.add("hello jackson 2"); msg.add("hello jackson 3"); user.setMessages(msg); return user; > >
// новый файл json создается в D: user.json »
5. JSON в объект Java
Прочитайте строку JSON и преобразуйте ее обратно в объект Java.
package com.csharpcoderr.json; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; public class JacksonExample < public static void main(String[] args) < ObjectMapper mapper = new ObjectMapper(); try < // Преобразование строки JSON из файла в объект User user = mapper.readValue(new File("G:\user.json"), User.class); System.out.println(user); // Преобразование строки JSON в объект String jsonInString = "<"age":33,"messages":["msg 1","msg 2"],"name":"mkyong">"; User user1 = mapper.readValue(jsonInString, User.class); System.out.println(user1); > catch (JsonGenerationException e) < e.printStackTrace(); >catch (JsonMappingException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >> >
User [name=mkyong, age=33, messages=[hello jackson 1, hello jackson 2, hello jackson 3]] User [name=mkyong, age=33, messages=[msg 1, msg 2]]
6. @JsonView
@JsonView поддерживается в Jackson начиная с версии 1.4, она позволяет вам контролировать, какие поля отображать.
6.1 Простой класс.
package com.csharpcoderr.json; public class Views < public static class NameOnly<>; public static class AgeAndName extends NameOnly<>; >
6.2 Аннотируйте поля, которые вы хотите отобразить.
package com.csharpcoderr.json; import java.util.List; import org.codehaus.jackson.map.annotate.JsonView; public class User < @JsonView(Views.NameOnly.class) private String name; @JsonView(Views.AgeAndName.class) private int age; private Listmessages; // геттер и сеттеры >
6.3 Включить @JsonView с помощью writerWithView() ,
package com.csharpcoderr.json; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig; public class JacksonExample < public static void main(String[] args) < ObjectMapper mapper = new ObjectMapper(); // По умолчанию все поля без явного определения вида включены, отключаем mapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false); //Для тестирования User user = createDummyUser(); try < // только отображаемое имя String jsonInString = mapper.writerWithView(Views.NameOnly.class).writeValueAsString(user); System.out.println(jsonInString); // отображаем namd ana age jsonInString = mapper.writerWithView(Views.AgeAndName.class).writeValueAsString(user); System.out.println(jsonInString); >catch (JsonGenerationException e) < e.printStackTrace(); >catch (JsonMappingException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >> private static User createDummyUser() < User user = new User(); user.setName("mkyong"); user.setAge(33); Listmsg = new ArrayList<>(); msg.add("hello jackson 1"); msg.add("hello jackson 2"); msg.add("hello jackson 3"); user.setMessages(msg); return user; > >
Рекомендации
- Проект Джексон Хоум @github
- Gson — конвертировать Java-объект в / из JSON
Конвертация Java объектов в JSON
Конвертация Java объектов есть одним из часто-используемых в разработке WEB-ресурсов. В этом уроке я покажу, как конвертировать Java объект в JSON или с JSON в Java объект.
Шаг 1
Для того чтобы манипулировать конвертированием мы будем использовать библиотеку Jackson.
Давайте создадим Maven project и добавим в pom.xml следующие зависимости:
com.fasterxml.jackson.core jackson-core 2.2.2 com.fasterxml.jackson.core jackson-databind 2.2.2 com.fasterxml.jackson.core jackson-annotations 2.2.2
Шаг 2
Теперь добавим POJO который мы и будем конвертировать:
package pojo; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; public class User < @JsonProperty("Number") private long id; @JsonProperty("First Name") private String name; @JsonProperty("Phone Number") private String phone; @JsonIgnore private String level; public User() < >public User(long id, String name, String phone, String level) < this.id = id; this.name = name; this.phone = phone; this.level = level; >public long getId() < return id; >public void setId(long id) < this.id = id; >public String getName() < return name; >public void setName(String name) < this.name = name; >public String getPhone() < return phone; >public void setPhone(String phone) < this.phone = phone; >public String getLevel() < return level; >public void setLevel(String level) < this.level = level; >@Override public String toString() < return "User[ID:" + id + ", Name: " + name + ", Phone: " + phone + "]"; >>
Обратите внимание, обязательно должен быть пустой конструктор и getter & setter.
Как вы видите мы используем две аннотации:
@JsonProperty(“name”) – эта говорит, что данный атрибут в JSON будет именоваться как name
@JsonIgnore – а эта аннотация игнорирует данный атрибут и в результате конвертирования он не будет добавлен в JSON.
Шаг 3
Теперь создадим класс конверте где будут все методы, и назовем его Converter.java:
package util; import com.fasterxml.jackson.databind.ObjectMapper; import pojo.User; import java.io.File; import java.io.IOException; public class Converter < private final static String baseFile = "user.json"; public static void toJSON(User user) throws IOException < ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(new File(baseFile), user); System.out.println("json created!"); >public static User toJavaObject() throws IOException < ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(new File(baseFile), User.class); >>
В результате выполнения появится файл user.json:
И после конвертации обратно в POJO мы получим объект с полями:
User[ID:1, Name: Alex, Phone: +38000000001]
Возникнут вопросы, выслушаю вас в комментариях.
ПОХОЖИЕ ПУБЛИКАЦИИ
-
None Found
16 комментариев к статье «Конвертация Java объектов в JSON»
Спасибо за статью, как раз сейчас разбираюсь с JSON. Может есть у вас в планах статья о JSON-Schema (json-schema.org)? И парсинг json’a по этой схеме и создание POJO? Было бы очень круто)
Добавил в черновики, постараюсь написать, сначала сделаю хороший екзампл.
было бы полезнее данный пример привести с методами, которые позволили бы читать json не из файла. К примеру, я работаю с бд, в которой сохраняю значения полей объекта в одном строковом поле. В таком случае мне больше подошла бы такая реализация: public String objectToJson(Object obj) throws JsonProcessingException <
String jsonObject = mapper.writeValueAsString(obj);
return jsonObject;
> public Object jsonToObject(String json) throws IOException <
Object obj = mapper.readValue(json, Sample.class);
return obj;
> где Sample – класс, с которым мы работаем. Затем, при вызове метода jsonToObject нам останется только привести полученный объект к нашему типу и делать с ним все, что угодно. Точно также дело обстоит с методом objectToJson – получаем чистую строку, с которой можем делать что угодно – писать в файл, в базу, выполнять манипуляции в коде и т.д. Я к тому, что такой пример был бы более абстрактен. Но в целом все отлично, мне нравятся ваши статьи
Евгений, полностью с вами согласен, но хотелось показать на примере файла, что бы новичкам было понятней.
А что будет если не добить Json нотации перед полями, класса, который мы собираемся переводить в json. И еще.. Корректно ли будет проводится конвертация встроенного класса, например Key или Location или DATATIME? Еще хотелось бы услышать про особенности использования библиотеки gson. Спасибо за доступную форму предоставления материала.
Без аннотаций вы скорее всего получите Exception но уже не помню, надо проверить, Да со встроеными классами это тоже должно нормально работать, но опять же давно делал и не могу сказать точно .
Исключений не будет, данные в любом случае попадут в файл, просто если не указать аннотацию над полем, то имя ключа в json будет соответствовать имени поля.