Как разобрать 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"
}
]
}
Необходимо узнать, как правильно извлечь данные из этого JSON в языке программирования, который я использую.
5 ответ(ов)
Если вы хотите создать объект Java из JSON и наоборот, можете использовать сторонние библиотеки, такие как GSON или JACKSON. Примеры кода:
// Из объекта в JSON
Gson gson = new Gson();
String jsonString = gson.toJson(yourObject);
// Из JSON в объект
YourObject o = gson.fromJson(jsonString, YourObject.class);
Если же вам просто нужно разобрать строку JSON и получить некоторые значения (или создать JSON-строку с нуля для передачи по сети), используйте JavaEE библиотеку, которая содержит JsonReader, JsonArray, JsonObject и т.д. Вы можете скачать реализацию этого специфика, например, javax.json. С помощью этих двух библиотек я смог разобрать JSON и использовать его значения.
Эти API фактически следуют модели парсинга DOM/SAX, подобно XML:
Response response = request.get(); // Вызов REST
JsonReader jsonReader = Json.createReader(new StringReader(response.readEntity(String.class)));
JsonArray jsonArray = jsonReader.readArray();
ListIterator<JsonObject> l = jsonArray.listIterator();
while (l.hasNext()) {
JsonObject j = l.next();
JsonObject ciAttr = j.getJsonObject("ciAttributes");
}
Надеюсь, это поможет вам в работе с JSON в Java!
A - Пояснение
Вы можете использовать библиотеки Jackson для связывания JSON-строки с экземплярами POJO (Plain Old Java Object). POJO — это просто класс с приватными полями и публичными методами-геттерами и сеттерами. Jackson будет проходить по методам (используя рефлексию) и сопоставлять JSON-объект с экземпляром POJO, поскольку имена полей класса соответствуют именам полей JSON-объекта.
В вашем JSON-объекте, который на самом деле является составным объектом, основной объект состоит из двух под-объектов. Таким образом, наши классы POJO должны иметь ту же иерархию. Я буду называть весь JSON-объект объектом Page. Объект Page состоит из объекта PageInfo и массива объектов Post.
Поэтому нам нужно создать три различных класса POJO:
- Класс Page, который является составным из класса PageInfo и массива экземпляров Post
- Класс PageInfo
- Класс Post
Единственный пакет, который я использовал, — это Jackson ObjectMapper. Мы связываем данные с помощью:
com.fasterxml.jackson.databind.ObjectMapper
Необходимые зависимости (jar-файлы) указаны ниже:
- jackson-core-2.5.1.jar
- jackson-databind-2.5.1.jar
- jackson-annotations-2.5.0.jar
Вот необходимый код:
B - Основной класс POJO : Page
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-файла : sampleJSONFile.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, в конструктор JSONObject из стандартного пакета org.json.
JSONArray rootOfPage = new JSONArray(JSONString);
Готово. Бросает микрофон. Это также работает и с JSONObjects
. После этого вы можете просто просматривать свою иерархию объектов, используя методы get()
на ваших объектах.
Gson — это простая в изучении и реализации библиотека для работы с JSON в Java. Вам следует знать о двух основных методах:
- toJson() – преобразует объект Java в формат JSON.
- fromJson() – преобразует JSON в объект Java.
Вот пример использования метода fromJson()
для чтения JSON-данных из файла:
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"));
// преобразуем строку JSON обратно в объект
DataObject obj = gson.fromJson(br, DataObject.class);
System.out.println(obj);
} catch (IOException e) {
e.printStackTrace();
}
}
}
В этой примере мы создаем экземпляр Gson
, читаем JSON данные из файла с помощью BufferedReader
, а затем преобразуем их в объект класса DataObject
. Не забудьте обрабатывать возможные исключения ввода-вывода!
Конечно! В вашем случае вы можете использовать библиотеку JSON.simple для разбора JSON-строки. Вот как это можно сделать:
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(contentString);
String productId = (String) jsonObject.get("productId");
В этом коде мы создаем экземпляр JSONParser
, а затем используем метод parse
, чтобы преобразовать строку contentString
в объект JSONObject
. После этого мы получаем значение productId
с помощью метода get
. Не забудьте обработать возможные исключения, такие как ParseException
, которые могут возникнуть при разборе JSON.
Безопасное преобразование строки JSON в объект
Почему Python не может разобрать эти данные JSON? [закрыто]
Парсинг JSON с помощью инструментов Unix
Jackson с JSON: Неузнанное поле, не помеченное как проигнорируемое
Что значит 'synchronized'?