Как разобрать JSON в Java
У меня есть следующий текст JSON. Как я могу разобрать это, чтобы получить pageName
, pagePic
, post_id
, так далее.?
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
}
"posts": [
{
"post_id": "123456789012_123456789012",
"actor_id": "1234567890",
"picOfPersonWhoPosted": "http://example.com/photo.jpg",
"nameOfPersonWhoPosted": "Jane Doe",
"message": "Sounds cool. Can't wait to see it!",
"likesCount": "2",
"comments": [],
"timeOfPost": "1234567890"
}
]
}
37 ответов
Библиотека org.json проста в использовании. Пример кода ниже:
import org.json.*;
JSONObject obj = new JSONObject(" .... ");
String pageName = obj.getJSONObject("pageInfo").getString("pageName");
JSONArray arr = obj.getJSONArray("posts");
for (int i = 0; i < arr.length(); i++)
{
String post_id = arr.getJSONObject(i).getString("post_id");
......
}
Вы можете найти больше примеров из: Parse JSON на Java
Загружаемый jar: http://mvnrepository.com/artifact/org.json/json
Для примера давайте предположим, что у вас есть класс Person
только с name
,
private class Person {
public String name;
public Person(String name) {
this.name = name;
}
}
Google GSON ( Maven)
Мой личный фаворит относительно великолепной сериализации / десериализации объектов в формате JSON.
Gson g = new Gson();
Person person = g.fromJson("{\"name\": \"John\"}", Person.class);
System.out.println(person.name); //John
System.out.println(g.toJson(person)); // {"name":"John"}
Обновить
Если вы хотите получить один атрибут, вы можете легко сделать это с помощью библиотеки Google:
JsonObject jsonObject = new JsonParser().parse("{\"name\": \"John\"}").getAsJsonObject();
System.out.println(jsonObject.get("name").getAsString()); //John
Org.JSON ( Maven)
Если вам не нужна десериализация объекта, а требуется просто получить атрибут, вы можете попробовать org.json (или посмотрите пример GSON выше!)
JSONObject obj = new JSONObject("{\"name\": \"John\"}");
System.out.println(obj.getString("name")); //John
Джексон ( Мавен)
ObjectMapper mapper = new ObjectMapper();
Person user = mapper.readValue("{\"name\": \"John\"}", Person.class);
System.out.println(user.name); //John
Если кто-то хочет создать объект Java из JSON и наоборот, используйте GSON или JACKSON сторонние файлы jar и т. Д.
//from object to JSON Gson gson = new Gson(); gson.toJson(yourObject); // from JSON to object yourObject o = gson.fromJson(JSONString,yourObject.class);
Но если нужно просто проанализировать строку JSON и получить некоторые значения ((ИЛИ создать строку JSON с нуля для отправки по проводам), просто используйте JaveEE jar, который содержит JsonReader, JsonArray, JsonObject и т. Д. Вы можете загрузить реализацию этого спецификация как javax.json. С этими двумя банками я могу проанализировать JSON и использовать значения.
Эти API-интерфейсы фактически следуют модели синтаксического анализа XML DOM / SAX.
Response response = request.get(); // REST call JsonReader jsonReader = Json.createReader(new StringReader(response.readEntity(String.class))); JsonArray jsonArray = jsonReader.readArray(); ListIterator l = jsonArray.listIterator(); while ( l.hasNext() ) { JsonObject j = (JsonObject)l.next(); JsonObject ciAttr = j.getJsonObject("ciAttributes");
Парсер quick-json очень простой, гибкий, очень быстрый и настраиваемый. Попытайся
Особенности:
- Соответствует спецификации JSON (RFC4627)
- Высокопроизводительный анализатор JSON
- Поддерживает гибкий / настраиваемый подход к анализу
- Настраиваемая проверка пар ключ / значение любой иерархии JSON
- Простота в использовании # Очень маленькая площадь
- Повышает дружественный к разработчику и легко отслеживать исключения
- Поддержка сменной настраиваемой проверки - ключи / значения можно проверять, настраивая настраиваемые средства проверки по мере их появления.
- Поддержка валидации и недействительности парсера
- Поддержка двух типов конфигурации (JSON/XML) для использования анализатора быстрой проверки JSON
- Требуется JDK 1.5
- Нет зависимости от внешних библиотек
- Поддержка JSON Generation через сериализацию объектов
- Поддержка выбора типа коллекции во время анализа
Это можно использовать так:
JsonParserFactory factory=JsonParserFactory.getInstance();
JSONParser parser=factory.newJsonParser();
Map jsonMap=parser.parseJson(jsonString);
Вы можете использовать Google Gson.
Используя эту библиотеку, вам нужно только создать модель с той же структурой JSON. Затем модель автоматически заполняется. Вы должны вызывать свои переменные в качестве ключей JSON или использовать @SerializedName, если хотите использовать разные имена.
Для вашего примера:
JSON:
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
}
"posts": [
{
"post_id": "123456789012_123456789012",
"actor_id": "1234567890",
"picOfPersonWhoPosted": "http://example.com/photo.jpg",
"nameOfPersonWhoPosted": "Jane Doe",
"message": "Sounds cool. Can't wait to see it!",
"likesCount": "2",
"comments": [],
"timeOfPost": "1234567890"
}
]
}
Модель:
class MyModel {
private PageInfo pageInfo;
private ArrayList<Post> posts = new ArrayList<>();
}
class PageInfo {
private String pageName;
private String pagePic;
}
class Post {
private String post_id;
@SerializedName("actor_id") // <- example SerializedName
private String actorId;
private String picOfPersonWhoPosted;
private String nameOfPersonWhoPosted;
private String message;
private String likesCount;
private ArrayList<String> comments;
private String timeOfPost;
}
Теперь вы можете анализировать с помощью библиотеки Gson:
MyModel model = gson.fromJson(jsonString, MyModel.class);
Вы можете генерировать модель из JSON автоматически, используя такие онлайн-инструменты.
A - Объяснение
Вы можете использовать библиотеки Джексона для привязки JSON String к экземплярам POJO (Plain Old Java Object). POJO - это просто класс с только закрытыми полями и общедоступными методами получения / установки. Джексон собирается просмотреть методы (используя отражение) и сопоставить объект JSON с экземпляром POJO, когда имена полей класса соответствуют именам полей объекта JSON.
В вашем объекте JSON, который на самом деле является составным объектом, основной объект состоит из двух подобъектов. Итак, наши классы POJO должны иметь одинаковую иерархию. Я назову весь объект JSON как объект страницы. Объект Page состоит из объекта PageInfo и массива объектов Post.
Таким образом, мы должны создать три разных класса POJO;
- Классстраницы, составная часть класса PageInfo и массив почтовых экземпляров
- КлассPageInfo
- Класссообщений
Единственный пакет, который я использовал, это Jackson ObjectMapper, мы делаем привязку данных;
com.fasterxml.jackson.databind.ObjectMapper
Необходимые зависимости jar-файлов перечислены ниже;
- ДЖЕКСОН-ядро-2.5.1.jar
- ДЖЕКСОН-DataBind-2.5.1.jar
- ДЖЕКСОН-аннотаций-2.5.0.jar
Вот необходимый код;
B - Основной класс POJO: Страница
package com.levo.jsonex.model;
public class Page {
private PageInfo pageInfo;
private Post[] posts;
public PageInfo getPageInfo() {
return pageInfo;
}
public void setPageInfo(PageInfo pageInfo) {
this.pageInfo = pageInfo;
}
public Post[] getPosts() {
return posts;
}
public void setPosts(Post[] posts) {
this.posts = posts;
}
}
C - Детский класс POJO: PageInfo
package com.levo.jsonex.model;
public class PageInfo {
private String pageName;
private String pagePic;
public String getPageName() {
return pageName;
}
public void setPageName(String pageName) {
this.pageName = pageName;
}
public String getPagePic() {
return pagePic;
}
public void setPagePic(String pagePic) {
this.pagePic = pagePic;
}
}
D - Детский класс POJO: Post
package com.levo.jsonex.model;
public class Post {
private String post_id;
private String actor_id;
private String picOfPersonWhoPosted;
private String nameOfPersonWhoPosted;
private String message;
private int likesCount;
private String[] comments;
private int timeOfPost;
public String getPost_id() {
return post_id;
}
public void setPost_id(String post_id) {
this.post_id = post_id;
}
public String getActor_id() {
return actor_id;
}
public void setActor_id(String actor_id) {
this.actor_id = actor_id;
}
public String getPicOfPersonWhoPosted() {
return picOfPersonWhoPosted;
}
public void setPicOfPersonWhoPosted(String picOfPersonWhoPosted) {
this.picOfPersonWhoPosted = picOfPersonWhoPosted;
}
public String getNameOfPersonWhoPosted() {
return nameOfPersonWhoPosted;
}
public void setNameOfPersonWhoPosted(String nameOfPersonWhoPosted) {
this.nameOfPersonWhoPosted = nameOfPersonWhoPosted;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getLikesCount() {
return likesCount;
}
public void setLikesCount(int likesCount) {
this.likesCount = likesCount;
}
public String[] getComments() {
return comments;
}
public void setComments(String[] comments) {
this.comments = comments;
}
public int getTimeOfPost() {
return timeOfPost;
}
public void setTimeOfPost(int timeOfPost) {
this.timeOfPost = timeOfPost;
}
}
E - Пример файла JSON: sample JSON File.json
Я просто скопировал ваш пример JSON в этот файл и поместил его в папку проекта.
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
},
"posts": [
{
"post_id": "123456789012_123456789012",
"actor_id": "1234567890",
"picOfPersonWhoPosted": "http://example.com/photo.jpg",
"nameOfPersonWhoPosted": "Jane Doe",
"message": "Sounds cool. Can't wait to see it!",
"likesCount": "2",
"comments": [],
"timeOfPost": "1234567890"
}
]
}
F - Демо-код
package com.levo.jsonex;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.levo.jsonex.model.Page;
import com.levo.jsonex.model.PageInfo;
import com.levo.jsonex.model.Post;
public class JSONDemo {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
try {
Page page = objectMapper.readValue(new File("sampleJSONFile.json"), Page.class);
printParsedObject(page);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void printParsedObject(Page page) {
printPageInfo(page.getPageInfo());
System.out.println();
printPosts(page.getPosts());
}
private static void printPageInfo(PageInfo pageInfo) {
System.out.println("Page Info;");
System.out.println("**********");
System.out.println("\tPage Name : " + pageInfo.getPageName());
System.out.println("\tPage Pic : " + pageInfo.getPagePic());
}
private static void printPosts(Post[] posts) {
System.out.println("Page Posts;");
System.out.println("**********");
for(Post post : posts) {
printPost(post);
}
}
private static void printPost(Post post) {
System.out.println("\tPost Id : " + post.getPost_id());
System.out.println("\tActor Id : " + post.getActor_id());
System.out.println("\tPic Of Person Who Posted : " + post.getPicOfPersonWhoPosted());
System.out.println("\tName Of Person Who Posted : " + post.getNameOfPersonWhoPosted());
System.out.println("\tMessage : " + post.getMessage());
System.out.println("\tLikes Count : " + post.getLikesCount());
System.out.println("\tComments : " + Arrays.toString(post.getComments()));
System.out.println("\tTime Of Post : " + post.getTimeOfPost());
}
}
G - Демонстрационный выход
Page Info;
****(*****
Page Name : abc
Page Pic : http://example.com/content.jpg
Page Posts;
**********
Post Id : 123456789012_123456789012
Actor Id : 1234567890
Pic Of Person Who Posted : http://example.com/photo.jpg
Name Of Person Who Posted : Jane Doe
Message : Sounds cool. Can't wait to see it!
Likes Count : 2
Comments : []
Time Of Post : 1234567890
Почти для всех приведенных ответов требуется полная десериализация JSON в объект Java перед получением значения в интересующем свойстве. Другой альтернативой, которая не идет по этому пути, является использование JsonPATH, который похож на XPath для JSON и позволяет обходить объекты JSON.
Это спецификация, и хорошие люди в JayWay создали реализацию Java для спецификации, которую вы можете найти здесь: https://github.com/jayway/JsonPath
Так что в основном, чтобы использовать его, добавьте его в свой проект, например:
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>${version}</version>
</dependency>
и использовать:
String pageName = JsonPath.read(yourJsonString, "$.pageInfo.pageName");
String pagePic = JsonPath.read(yourJsonString, "$.pageInfo.pagePic");
String post_id = JsonPath.read(yourJsonString, "$.pagePosts[0].post_id");
так далее...
Посетите страницу спецификации JsonPath для получения дополнительной информации о других способах прохождения JSON.
Используйте minimal-json, который очень быстрый и простой в использовании. Вы можете анализировать из String obj и Stream.
Пример данных:
{
"order": 4711,
"items": [
{
"name": "NE555 Timer IC",
"cat-id": "645723",
"quantity": 10,
},
{
"name": "LM358N OpAmp IC",
"cat-id": "764525",
"quantity": 2
}
]
}
Синтаксический:
JsonObject object = Json.parse(input).asObject();
int orders = object.get("order").asInt();
JsonArray items = object.get("items").asArray();
Создание JSON:
JsonObject user = Json.object().add("name", "Sakib").add("age", 23);
Maven:
<dependency>
<groupId>com.eclipsesource.minimal-json</groupId>
<artifactId>minimal-json</artifactId>
<version>0.9.4</version>
</dependency>
В приведенном ниже примере показано, как читать текст вопроса, представленный в виде переменной "jsonText". В этом решении используется API Java EE7 javax.json (который упоминается в некоторых других ответах). Причина, по которой я добавил его в качестве отдельного ответа, заключается в том, что следующий код показывает, как на самом деле получить доступ к некоторым значениям, показанным в вопросе. Для запуска этого кода потребуется реализация API javax.json. Полный пакет для каждого из необходимых классов был включен, так как я не хотел объявлять операторы import.
javax.json.JsonReader jr =
javax.json.Json.createReader(new StringReader(jsonText));
javax.json.JsonObject jo = jr.readObject();
//Read the page info.
javax.json.JsonObject pageInfo = jo.getJsonObject("pageInfo");
System.out.println(pageInfo.getString("pageName"));
//Read the posts.
javax.json.JsonArray posts = jo.getJsonArray("posts");
//Read the first post.
javax.json.JsonObject post = posts.getJsonObject(0);
//Read the post_id field.
String postId = post.getString("post_id");
Теперь, прежде чем кто-то пойдет и понизит этот ответ, потому что он не использует GSON, org.json, Jackson или любые другие доступные сторонние фреймворки, это пример "необходимого кода" в вопросе для анализа предоставленного текста. Мне хорошо известно, что соблюдение текущего стандарта JSR 353 не рассматривалось для JDK 9, и поэтому спецификацию JSR 353 следует рассматривать так же, как и любую другую реализацию обработки JSON сторонних производителей.
Поскольку никто еще не упомянул об этом, вот начало решения, использующего Nashorn (JavaScript-часть Java 8, но не рекомендуется в Java 11).
Решение
private static final String EXTRACTOR_SCRIPT =
"var fun = function(raw) { " +
"var json = JSON.parse(raw); " +
"return [json.pageInfo.pageName, json.pageInfo.pagePic, json.posts[0].post_id];};";
public void run() throws ScriptException, NoSuchMethodException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(EXTRACTOR_SCRIPT);
Invocable invocable = (Invocable) engine;
JSObject result = (JSObject) invocable.invokeFunction("fun", JSON);
result.values().forEach(e -> System.out.println(e));
}
Сравнение производительности
Я написал JSON-контент, содержащий три массива по 20, 20 и 100 элементов соответственно. Я только хочу получить 100 элементов из третьего массива. Я использую следующую функцию JavaScript для анализа и получения своих записей.
var fun = function(raw) {JSON.parse(raw).entries};
Выполнение вызова миллион раз с помощью Nashorn занимает 7,5~7,8 секунд
(JSObject) invocable.invokeFunction("fun", json);
org.json занимает 20~21 секунд
new JSONObject(JSON).getJSONArray("entries");
Джексон занимает 6,5~7 секунд
mapper.readValue(JSON, Entries.class).getEntries();
В этом случае Джексон работает лучше, чем Nashorn, который работает намного лучше, чем org.json. API Nashorn сложнее в использовании, чем в org.json или Jackson's. В зависимости от ваших требований Джексон и Нашорн могут быть жизнеспособными решениями.
Я считаю, что лучшая практика должна состоять в том, чтобы пройти через официальный API Java JSON, который все еще находится в стадии разработки.
Это поразило меня тем, как легко это было. Вы можете просто передать String
удержание вашего JSON в конструкторе JSONObject в пакете org.json по умолчанию.
JSONArray rootOfPage = new JSONArray(JSONString);
Готово. Сбрасывает микрофон. Это работает с JSONObjects
также. После этого вы можете просто просмотреть свою иерархию Objects
с использованием get()
методы на ваших объектах.
В Java доступно много библиотек JSON.
Наиболее известные из них: Джексон, GSON, Genson, FastJson и org.json.
Как правило, есть три вещи, на которые следует обратить внимание при выборе любой библиотеки:
- Спектакль
- Простота использования (код прост для написания и разборчивый) - это идет с функциями.
- Для мобильных приложений: размер зависимости / размер фляги
В частности, для библиотек JSON (и любых библиотек сериализации / десериализации) связывание данных также обычно представляет интерес, поскольку устраняет необходимость написания стандартного кода для упаковки / распаковки данных.
Для 1, см. Этот тест: https://github.com/fabienrenaud/java-json-benchmark Я сделал с помощью JMH, который сравнивает (Джексон, GSON, GENSON, FastJSON, ORG.JSON, JSONP) производительность сериализаторов и десериализаторов с использованием потока и API привязки данных. Для 2 вы можете найти множество примеров в Интернете. Вышеприведенный тест также можно использовать в качестве источника примеров...
Быстрый тест: Джексон работает в 5-6 раз лучше, чем org.json, и более чем в два раза лучше, чем GSON.
Для вашего конкретного примера следующий код декодирует ваш JSON с Джексоном:
public class MyObj {
private PageInfo pageInfo;
private List<Post> posts;
static final class PageInfo {
private String pageName;
private String pagePic;
}
static final class Post {
private String post_id;
@JsonProperty("actor_id");
private String actorId;
@JsonProperty("picOfPersonWhoPosted")
private String pictureOfPoster;
@JsonProperty("nameOfPersonWhoPosted")
private String nameOfPoster;
private String likesCount;
private List<String> comments;
private String timeOfPost;
}
private static final ObjectMapper JACKSON = new ObjectMapper();
public static void main(String[] args) throws IOException {
MyObj o = JACKSON.readValue(args[0], MyObj.class); // assumes args[0] contains your json payload provided in your question.
}
}
Дайте знать, если у вас появятся вопросы.
В дополнение к другим ответам я рекомендую этот онлайн-сервис с открытым исходным кодом http://www.jsonschema2pojo.org/ для быстрой генерации классов Java из схемы json или json для GSON, Jackson 1.x или Jackson 2.x. Например, если у вас есть:
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
}
"posts": [
{
"post_id": "123456789012_123456789012",
"actor_id": 1234567890,
"picOfPersonWhoPosted": "http://example.com/photo.jpg",
"nameOfPersonWhoPosted": "Jane Doe",
"message": "Sounds cool. Can't wait to see it!",
"likesCount": 2,
"comments": [],
"timeOfPost": 1234567890
}
]
}
http://www.jsonschema2pojo.org/ для GSON сгенерировал:
@Generated("org.jsonschema2pojo")
public class Container {
@SerializedName("pageInfo")
@Expose
public PageInfo pageInfo;
@SerializedName("posts")
@Expose
public List<Post> posts = new ArrayList<Post>();
}
@Generated("org.jsonschema2pojo")
public class PageInfo {
@SerializedName("pageName")
@Expose
public String pageName;
@SerializedName("pagePic")
@Expose
public String pagePic;
}
@Generated("org.jsonschema2pojo")
public class Post {
@SerializedName("post_id")
@Expose
public String postId;
@SerializedName("actor_id")
@Expose
public long actorId;
@SerializedName("picOfPersonWhoPosted")
@Expose
public String picOfPersonWhoPosted;
@SerializedName("nameOfPersonWhoPosted")
@Expose
public String nameOfPersonWhoPosted;
@SerializedName("message")
@Expose
public String message;
@SerializedName("likesCount")
@Expose
public long likesCount;
@SerializedName("comments")
@Expose
public List<Object> comments = new ArrayList<Object>();
@SerializedName("timeOfPost")
@Expose
public long timeOfPost;
}
Если у вас есть какой-то класс Java (скажем, Message), представляющий строку JSON (jsonString), вы можете использовать библиотеку JSON Jackson с:
Message message= new ObjectMapper().readValue(jsonString, Message.class);
и из объекта сообщения вы можете получить любой его атрибут.
Gson легко выучить и реализовать, нам нужно знать следующие два метода
toJson() - конвертировать объект Java в формат JSON
fromJson() - конвертировать JSON в объект Java
`
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import com.google.gson.Gson;
public class GsonExample {
public static void main(String[] args) {
Gson gson = new Gson();
try {
BufferedReader br = new BufferedReader(
new FileReader("c:\\file.json"));
//convert the json string back to object
DataObject obj = gson.fromJson(br, DataObject.class);
System.out.println(obj);
} catch (IOException e) {
e.printStackTrace();
}
}
}
`
Существует много библиотек с открытым исходным кодом для анализа содержимого JSON объекта или просто для чтения значений JSON. Ваше требование - просто читать значения и анализировать их для пользовательского объекта. Так что в вашем случае достаточно библиотеки org.json.
Используйте библиотеку org.json, чтобы разобрать ее и создать JsonObject:
JSONObject jsonObj = new JSONObject(<jsonStr>);
Теперь используйте этот объект, чтобы получить ваши значения:
String id = jsonObj.getString("pageInfo");
Вы можете увидеть полный пример здесь:
Прочитайте следующий пост в блоге, JSON на Java.
Этот пост немного староват, но все же я хочу ответить на ваш вопрос.
Шаг 1: Создайте класс POJO из ваших данных.
Шаг 2: Теперь создайте объект, используя JSON.
Employee employee = null;
ObjectMapper mapper = new ObjectMapper();
try{
employee = mapper.readValue(newFile("/home/sumit/employee.json"), Employee.class);
}
catch (JsonGenerationException e){
e.printStackTrace();
}
Для дальнейшего ознакомления вы можете обратиться по следующей ссылке.
Пожалуйста, сделайте что-то вроде этого:
JSONParser jsonParser = new JSONParser();
JSONObject obj = (JSONObject) jsonParser.parse(contentString);
String product = (String) jsonObject.get("productId");
Вы можете использовать библиотеку Gson для анализа строки JSON.
Gson gson = new Gson();
JsonObject jsonObject = gson.fromJson(jsonAsString, JsonObject.class);
String pageName = jsonObject.getAsJsonObject("pageInfo").get("pageName").getAsString();
String pagePic = jsonObject.getAsJsonObject("pageInfo").get("pagePic").getAsString();
String postId = jsonObject.getAsJsonArray("posts").get(0).getAsJsonObject().get("post_id").getAsString();
Вы также можете перебрать массив "posts" следующим образом:
JsonArray posts = jsonObject.getAsJsonArray("posts");
for (JsonElement post : posts) {
String postId = post.getAsJsonObject().get("post_id").getAsString();
//do something
}
Для начала вам нужно выбрать библиотеку реализации.
Java API для обработки JSON (JSR 353) предоставляет переносимые API для анализа, генерации, преобразования и запроса JSON с использованием объектной модели и потоковых API.
Справочная реализация находится здесь: https://jsonp.java.net/
Здесь вы можете найти список реализаций JSR 353:
Какие API, которые реализуют JSR-353 (JSON)
И чтобы помочь вам решить... Я также нашел эту статью:
http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/
Если вы выбираете Джексона, вот хорошая статья о преобразовании между JSON в / из Java с использованием Джексона: https://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/
Надеюсь, поможет!
Вы можете использовать Jayway JsonPath. Ниже приведена ссылка на GitHub с исходным кодом, подробностями о pom и хорошей документацией.
https://github.com/jayway/JsonPath
Пожалуйста, следуйте инструкциям ниже.
Шаг 1: Добавьте зависимость пути JSON JAYWAY в путь к классу с помощью Maven или загрузите файл JAR и добавьте его вручную.
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.2.0</version>
</dependency>
Шаг 2: Пожалуйста, сохраните ваш входной JSON как файл для этого примера. В моем случае я сохранил ваш JSON как sampleJson.txt. Обратите внимание, что вы пропустили запятую между pageInfo и сообщениями.
Шаг 3: Считайте содержимое JSON из вышеуказанного файла, используя bufferedReader, и сохраните его как String.
BufferedReader br = new BufferedReader(new FileReader("D:\\sampleJson.txt"));
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
br.close();
String jsonInput = sb.toString();
Шаг 4: проанализируйте вашу строку JSON с помощью jayway JSON parser.
Object document = Configuration.defaultConfiguration().jsonProvider().parse(jsonInput);
Шаг 5: Прочитайте детали как ниже.
String pageName = JsonPath.read(document, "$.pageInfo.pageName");
String pagePic = JsonPath.read(document, "$.pageInfo.pagePic");
String post_id = JsonPath.read(document, "$.posts[0].post_id");
System.out.println("$.pageInfo.pageName " + pageName);
System.out.println("$.pageInfo.pagePic " + pagePic);
System.out.println("$.posts[0].post_id " + post_id);
Выход будет:
$.pageInfo.pageName = abc
$.pageInfo.pagePic = http://example.com/content.jpg
$.posts[0].post_id = 123456789012_123456789012
У меня есть JSON, как это:
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
}
}
Класс Java
class PageInfo {
private String pageName;
private String pagePic;
// Getters and setters
}
Код для преобразования этого JSON в класс Java.
PageInfo pageInfo = JsonPath.parse(jsonString).read("$.pageInfo", PageInfo.class);
специалист
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.2.0</version>
</dependency>
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
},
"posts": [
{
"post_id": "123456789012_123456789012",
"actor_id": "1234567890",
"picOfPersonWhoPosted": "http://example.com/photo.jpg",
"nameOfPersonWhoPosted": "Jane Doe",
"message": "Sounds cool. Can't wait to see it!",
"likesCount": "2",
"comments": [],
"timeOfPost": "1234567890"
}
]
}
Java code :
JSONObject obj = new JSONObject(responsejsonobj);
String pageName = obj.getJSONObject("pageInfo").getString("pageName");
JSONArray arr = obj.getJSONArray("posts");
for (int i = 0; i < arr.length(); i++)
{
String post_id = arr.getJSONObject(i).getString("post_id");
......etc
}
Лучшие ответы на этой странице используют слишком простые примеры, такие как объект с одним свойством (например, {name: value}). Я думаю, что этот простой, но реальный пример может кому-то помочь.
Итак, это JSON, возвращаемый Google Translate API:
{
"data":
{
"translations":
[
{
"translatedText": "Arbeit"
}
]
}
}
Я хочу получить значение атрибута "translationText", например, "Arbeit", используя Google Gson.
Два возможных подхода:
Получить только один необходимый атрибут
String json = callToTranslateApi("work", "de"); JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject(); return jsonObject.get("data").getAsJsonObject() .get("translations").getAsJsonArray() .get(0).getAsJsonObject() .get("translatedText").getAsString();
Создать объект Java из JSON
class ApiResponse { Data data; class Data { Translation[] translations; class Translation { String translatedText; } } }
...
Gson g = new Gson(); String json =callToTranslateApi("work", "de"); ApiResponse response = g.fromJson(json, ApiResponse.class); return response.data.translations[0].translatedText;
любые шаги массива json для решения проблемы.
-
convert your json object to java object
- вы можете использовать эту ссылку или любой онлайн https://json2csharp.com/json-to-pojo
- Сохраните как класс Java, например Myclass.java
- Myclass obj=new Gson().fromJson(JsonStr, Myclass.class);
- используя объект, вы можете получить свои значения.
Если у вас есть проект maven, добавьте ниже зависимость или обычный проект добавьте json-simple jar.
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180813</version>
</dependency>
Напишите ниже java-код для преобразования строки JSON в массив JSON.
JSONArray ja = new JSONArray(String jsonString);
Можно использовать аннотацию Apache @Model для создания классов модели Java, представляющих структуру файлов JSON, и использовать их для доступа к различным элементам в дереве JSON. В отличие от других решений, это работает полностью без отражения и поэтому подходит для условий, где отражение невозможно или сопровождается значительными накладными расходами.
Существует пример проекта Maven, показывающий использование. Прежде всего это определяет структуру:
@Model(className="RepositoryInfo", properties = {
@Property(name = "id", type = int.class),
@Property(name = "name", type = String.class),
@Property(name = "owner", type = Owner.class),
@Property(name = "private", type = boolean.class),
})
final class RepositoryCntrl {
@Model(className = "Owner", properties = {
@Property(name = "login", type = String.class)
})
static final class OwnerCntrl {
}
}
а затем он использует сгенерированные классы RepositoryInfo и Owner для анализа предоставленного входного потока и получения определенной информации при этом:
List<RepositoryInfo> repositories = new ArrayList<>();
try (InputStream is = initializeStream(args)) {
Models.parse(CONTEXT, RepositoryInfo.class, is, repositories);
}
System.err.println("there is " + repositories.size() + " repositories");
repositories.stream().filter((repo) -> repo != null).forEach((repo) -> {
System.err.println("repository " + repo.getName() +
" is owned by " + repo.getOwner().getLogin()
);
})
Вот и все! В дополнение к этому, здесь приведен пример, демонстрирующий аналогичный пример вместе с асинхронным сетевым взаимодействием.
Если ваши данные просты и вам не нужны внешние зависимости, используйте несколько строк кода:
/**
* A very simple JSON parser for one level, everything quoted.
* @param json the json content.
* @return a key => value map.
*/
public static Map<String, String> simpleParseJson(String json) {
Map<String, String> map = new TreeMap<>();
String qs[] = json.replace("\\\"", "\u0001").replace("\\\\", "\\").split("\"");
for (int i = 1; i + 3 < qs.length; i += 4) {
map.put(qs[i].replace('\u0001', '"'), qs[i + 2].replace('\u0001', '"'));
}
return map;
}
Итак, эти данные
{"name":"John", "age":"30", "car":"a \"quoted\" back\\slash car"}
дает карту, содержащую
{age=30, car=a "quoted" back\slash car, name=John}
Это может быть обновлено для работы со значениями без кавычек...
/**
* A very simple JSON parser for one level, names are quoted.
* @param json the json content.
* @return a key => value map.
*/
public static Map<String, String> simpleParseJson(String json) {
Map<String, String> map = new TreeMap<>();
String qs[] = json.replace("\\\"", "\u0001").replace("\\\\", "\\").split("\"");
for (int i = 1; i + 1 < qs.length; i += 4) {
if (qs[i + 1].trim().length() > 1) {
String x = qs[i + 1].trim();
map.put(qs[i].replace('\u0001', '"'), x.substring(1, x.length() - 1).trim().replace('\u0001', '"'));
i -= 2;
} else {
map.put(qs[i].replace('\u0001', '"'), qs[i + 2].replace('\u0001', '"'));
}
}
return map;
}
И чтобы решить сложную структуру, это становится некрасиво... ... ИЗВИНИТЕ!!! ... но я не мог устоять перед тем, чтобы закодировать его ^^ Это анализирует данный JSON, о котором идет речь, и многое другое. Это дает вложенные карты и списки.
/**
* A very simple JSON parser, names are quoted.
*
* @param json the json content.
* @return a key => value map.
*/
public static Map<String, Object> simpleParseJson(String json) {
Map<String, Object> map = new TreeMap<>();
String qs[] = json.replace("\\\"", "\u0001").replace("\\\\", "\\").split("\"");
int index[] = { 1 };
recurse(index, map, qs);
return map;
}
/**
* Eierlegende Wollmilchsau.
*
* @param index index into array.
* @param map the current map to fill.
* @param qs the data.
*/
private static void recurse(int[] index, Map<String, Object> map, String[] qs) {
int i = index[0];
for (;; i += 4) {
String end = qs[i - 1].trim(); // check for termination of an object
if (end.startsWith("}")) {
qs[i - 1] = end.substring(1).trim();
i -= 4;
break;
}
String key = qs[i].replace('\u0001', '"');
String x = qs[i + 1].trim();
if (x.endsWith("{")) {
x = x.substring(0, x.length() - 1).trim();
if (x.endsWith("[")) {
List<Object> list = new ArrayList<>();
index[0] = i + 2;
for (;;) {
Map<String, Object> inner = new TreeMap<>();
list.add(inner);
recurse(index, inner, qs);
map.put(key, list);
i = index[0];
String y = qs[i + 3]; // check for termination of array
if (y.startsWith("]")) {
qs[i + 3] = y.substring(1).trim();
break;
}
}
continue;
}
Map<String, Object> inner = new TreeMap<>();
index[0] = i + 2;
recurse(index, inner, qs);
map.put(key, inner);
i = index[0];
continue;
}
if (x.length() > 1) { // unquoted
String value = x.substring(1, x.length() - 1).trim().replace('\u0001', '"');
if ("[]".equals(value)) // handle empty array
map.put(key, new ArrayList<>());
else
map.put(key, value);
i -= 2;
} else {
map.put(key, qs[i + 2].replace('\u0001', '"'));
}
}
index[0] = i;
}
выходы - если распечатать карту:
{pageInfo={pageName=abc, pagePic=http://example.com/content.jpg}, posts=[{actor_id=1234567890, comments=[], likesCount=2, message=Sounds cool. Can't wait to see it!, nameOfPersonWhoPosted=Jane Doe, picOfPersonWhoPosted=http://example.com/photo.jpg, post_id=123456789012_123456789012, timeOfPost=1234567890}]}
Jakarta (Java) Enterprise Edition 8 включает JSON-B (Java API для привязки JSON). Итак, если вы используете сервер Jakarta EE 8, например Payara 5, JSON-B будет доступен прямо из коробки.
Простой пример без специальной настройки:
public static class Dog {
public String name;
public int age;
public boolean bites;
}
// Create a dog instance
Dog dog = new Dog();
dog.name = "Falco";
dog.age = 4;
dog.bites = false;
// Create Jsonb and serialize
Jsonb jsonb = JsonbBuilder.create();
String result = jsonb.toJson(dog);
// Deserialize back
dog = jsonb.fromJson("{\"name\":\"Falco\",\"age\":4,\"bites\":false}", Dog.class);
Вы можете настроить сопоставление, используя конфигурацию, аннотации, адаптеры и (де) сериализаторы.
Если вы не используете Jakarta EE 8, всегда можно установить JSON-B.