Как разбирать 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"
}
]
}
Ответы
Ответ 1
Библиотека 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
Загружаемый банку: http://mvnrepository.com/artifact/org.json/json
Ответ 2
Для примера предположим, что у вас есть класс Person
только с name
.
private class Person {
public String name;
public Person(String name) {
this.name = name;
}
}
Мой личный фаворит в отношении большой сериализации/де-сериализации объектов 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(или посмотреть пример 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
Ответ 3
-
Если вы хотите создать объект Java из JSON и наоборот, используйте сторонние банки GSON или JACKSON и т.д.
//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");
Ответ 4
quick-json parser - очень простой, гибкий, очень быстрый и настраиваемый. Попробуйте
Особенности:
- Соответствует спецификации JSON (RFC4627)
- Высокопроизводительный анализатор JSON
- Поддержка гибкого/настраиваемого подхода синтаксического анализа
- Настраиваемая проверка пар ключ/значение любой иерархии JSON
- Прост в использовании # Очень маленький размер
- Повышает безопасность для разработчиков и легко отслеживает исключения
- Поддержка подключаемых пользовательских валидаций. Ключи/значения могут быть подтверждены путем настройки пользовательских валидаторов по мере их возникновения.
- Поддержка проверки и неавтоматизации парсера
- Поддержка двух типов конфигурации (JSON/XML) для использования проверочного парсера с быстрым JSON
- Требуется JDK 1.5
- Нет зависимости от внешних библиотек
- Поддержка генерации JSON посредством сериализации объектов
- Поддержка выбора типа коллекции во время процесса анализа.
Его можно использовать следующим образом:
JsonParserFactory factory=JsonParserFactory.getInstance();
JSONParser parser=factory.newJsonParser();
Map jsonMap=parser.parseJson(jsonString);
Ответ 5
A - Пояснение
Вы можете использовать библиотеки Jackson для привязки строки JSON к POJO (Обычным старым объектам Java). POJO - это просто класс с только частными полями и общедоступными методами getter/setter. Джексон будет проходить методы (используя отражение) и сопоставляет объект JSON в экземпляр POJO, поскольку имена полей класса соответствуют именам полей объекта JSON.
В вашем объекте JSON, который на самом деле является составным объектом, главный объект состоит из двух под-объектов. Итак, наши классы POJO должны иметь одинаковую иерархию. Я буду называть весь объект JSON объектом Page. Страница состоит из объекта PageInfo и массива объектов Опубликовать.
Итак, нам нужно создать три разных класса 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 для детей: сообщение
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
Ответ 6
Почти все предоставленные ответы требуют полной десериализации 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.
Ответ 7
Вы можете использовать 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 автоматически с помощью онлайн - инструментов, как это.
Ответ 8
Используйте минимальный 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>
Ответ 9
Я считаю, что наилучшей практикой должно быть пройти официальное Java JSON API, которое все еще продолжается.
Ответ 10
В приведенном ниже примере показано, как читать текст в вопросе, представленный как переменная jsonText. Это решение использует API Java EE7 javax.json (о чем упоминается в некоторых других ответах). Причина, по которой я добавил его в качестве отдельного ответа, состоит в том, что следующий код показывает, как фактически получить доступ к некоторым значениям, указанным в вопросе. Для выполнения этого кода потребуется реализация javax.json API. Полный пакет для каждого из необходимых классов был включен, так как я не хотел объявлять "импортные" операторы.
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 spec следует рассматривать так же, как и любая другая сторонняя реализация JSON-обработки.
Ответ 11
Это смутило меня с легкостью. Вы можете просто передать String
, удерживая JSON в конструкторе JSONObject в пакете org.json по умолчанию.
JSONArray rootOfPage = new JSONArray(JSONString);
Готово. Капельки микрофона.
Это работает и с JSONObjects
. После этого вы можете просто просмотреть свою иерархию Objects
с помощью методов get()
на ваших объектах.
Ответ 12
Поскольку никто еще не упомянул об этом, вот начало решения с использованием 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. Nashorn API сложнее использовать, чем org.json или Jackson's. В зависимости от ваших требований Джексон и Нашорн могут быть жизнеспособными решениями.
Ответ 13
В Java доступно много JSON-библиотек.
Самые известные из них: Джексон, GSON, Genson, FastJson и org.json.
Обычно для выбора любой библиотеки нужно искать три вещи:
- Производительность
- Простота использования (код прост в написании и разборчивости) - это относится к функциям.
- Для мобильных приложений: зависимость/размер jar
В частности, для библиотек JSON (и любых сериализационных/десериализационных библиотек) также интересна привязка данных, поскольку она устраняет необходимость написания кода котельной пластины для упаковки/распаковки данных.
Для 1 см. этот тест: https://github.com/fabienrenaud/java-json-benchmark Я использовал JMH, который сравнивает (джексон, gson, genson, fastjson, org.json, jsonp) производительность сериализаторов и десериализаторов с использованием API потоков и данных.
Для 2 вы можете найти множество примеров в Интернете. Вышеупомянутый эталон также может быть использован в качестве источника примеров...
Быстрый вынос теста: Джексон выполняет в 5-6 раз лучше, чем org.json, и более чем в два раза лучше, чем GSON.
В вашем конкретном примере следующий код расшифровывает ваш json с помощью jackson:
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.
}
}
Сообщите мне, если у вас есть какие-либо вопросы.
Ответ 14
Если у вас есть Java-класс (например, Message), представляющий строку JSON (jsonString), вы можете использовать библиотеку Jackson JSON с:
Message message= new ObjectMapper().readValue(jsonString, Message.class);
и из объекта сообщения вы можете получить любой из его атрибутов.
Ответ 15
В дополнение к другим ответам, я рекомендую эту онлайн-службу с открытым исходным кодом jsonschema2pojo.org для быстрого создания классов Java из json или json schema для GSON, Джексон 1.x или Джексон 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
}
]
}
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;
}
Ответ 16
Существует много библиотек с открытым исходным кодом для анализа содержимого JSON объекта или просто для чтения значений JSON. Ваше требование - просто читать значения и анализировать их для пользовательского объекта. Так что в вашем случае достаточно библиотеки org.json.
Используйте библиотеку org.json для ее анализа и создания JsonObject:
JSONObject jsonObj = new JSONObject(<jsonStr>);
Теперь используйте этот объект, чтобы получить ваши значения:
String id = jsonObj.getString("pageInfo");
Вы можете увидеть полный пример здесь:
Как разобрать JSON в Java
Ответ 17
Gson легко учится и реализуется, что нам нужно знать, следуя двум методам
`
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();
}
}
}
`
Ответ 18
Прошу сделать что-то вроде этого:
JSONParser jsonParser = new JSONParser();
JSONObject obj = (JSONObject) jsonParser.parse(contentString);
String product = (String) jsonObject.get("productId");
Ответ 19
Вы можете использовать библиотеку 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
}
Ответ 20
Прочитайте следующий пост в блоге, 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();
}
Для дальнейшего ознакомления вы можете обратиться по следующей ссылке.
Ответ 21
{
"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
}
Ответ 22
Лучшие ответы на этой странице используют слишком простые примеры, такие как объект с одним свойством (например, {name: value}). Я думаю, что простой, но реальный пример жизни может помочь кому-то.
Итак, это JSON, возвращенный API Google Translate:
{
"data":
{
"translations":
[
{
"translatedText": "Arbeit"
}
]
}
}
Я хочу получить значение атрибута "translText", например. "Арбейт" с помощью 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;
Ответ 23
Сначала вам нужно выбрать библиотеку реализации.
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 с помощью Jackson: https://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/ p >
Надеюсь, что это поможет!
Ответ 24
Вы можете использовать Jayway JsonPath. Ниже приведена ссылка GitHub с исходным кодом, деталями pom и хорошей документацией.
https://github.com/jayway/JsonPath
Следуйте приведенным ниже инструкциям.
Шаг 1: добавьте зависимость пути Jayway JSON в свой путь к классу с помощью Maven или загрузите файл JAR и вручную добавьте его.
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.2.0</version>
</dependency>
Шаг 2: Сохраните ввод JSON в качестве файла для этого примера. В моем случае я сохранил ваш JSON как sampleJson.txt. Обратите внимание, что вы пропустили запятую между страницами и сообщениями.
Шаг 3: прочитайте содержимое JSON из вышеуказанного файла с помощью буферизованного считывателя и сохраните его как 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.
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
Ответ 25
У меня 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>
Ответ 26
jsoniter
(jsoniterator) - относительно новая и простая библиотека json, разработанная для простой и быстрой работы. Все, что вам нужно сделать для десериализации данных json, - это
JsonIterator.deserialize(jsonData, int[].class);
где jsonData
- это строка json-данных.
Ознакомьтесь с официальным сайтом для получения дополнительной информации.
Ответ 27
Мы можем использовать класс JSONObject для преобразования строки JSON в объект JSON и итерации по объекту JSON. Используйте следующий код.
JSONObject jObj = new JSONObject(contents.trim());
Iterator<?> keys = jObj.keys();
while( keys.hasNext() ) {
String key = (String)keys.next();
if ( jObj.get(key) instanceof JSONObject ) {
System.out.println(jObj.getString(String key));
}
}
Ответ 28
Можно использовать 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()
);
})
Вот и все! Кроме того, здесь представлен live gist, показывающий аналогичный пример вместе с асинхронной сетевой связью.
Ответ 29
Вы можете использовать библиотеку разбора потока DSM для разбора сложных документов json и XML. DSM анализирует данные только один раз и не загружает все данные в память.
Допустим, у нас есть класс Page для десериализации данных JSON.
Класс страницы
public class Page {
private String pageName;
private String pageImage;
private List<Sting> postIds;
// getter/setter
}
Создайте файл сопоставления yaml.
result:
type: object # result is array
path: /posts
fields:
pageName:
path: /pageInfo/pageName
pageImage:
path: /pageInfo/pagePic
postIds:
path: post_id
type: array
Используйте DSM для извлечения полей.
DSM dsm=new DSMBuilder(new File("path-to-yaml-config.yaml")).create(Page.class);
Page page= (Page)dsm.toObject(new path-to-json-data.json");
переменная страницы, сериализованная в json:
{
"pageName" : "abc",
"pageImage" : "http://example.com/content.jpg",
"postIds" : [ "123456789012_123456789012" ]
}
DSM очень хорош для сложных JSON и XML.
Ответ 30
Вы можете использовать JsonNode
для структурированного древовидного представления вашей строки JSON. Это часть обширной рок- джексон-библиотеки, которая вездесуща.
ObjectMapper mapper = new ObjectMapper();
JsonNode yourObj = mapper.readTree("{\"k\":\"v\"}");