У меня есть следующий текст 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"
}
]
}
Библиотека 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
org.json
другим библиотекам для простого анализа JSON, даже не глядя. Это справочная библиотека, созданная Дугласом Крокфордом (первооткрывателем JSON).
Для примера предположим, что у вас есть класс 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
JsonNode
, GSON имеет нечто похожее). Может быть хорошо показывать фрагменты, так как это похоже на единственный способ, который предлагает org.json.
Если вы хотите создать объект 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");
quick-json parser - очень простой, гибкий, очень быстрый и настраиваемый. Попробуйте
Особенности:
Его можно использовать следующим образом:
JsonParserFactory factory=JsonParserFactory.getInstance();
JSONParser parser=factory.newJsonParser();
Map jsonMap=parser.parseJson(jsonString);
Почти все предоставленные ответы требуют полной десериализации 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.
Вы можете использовать библиотеки Jackson для привязки строки JSON к POJO (Обычным старым объектам Java). POJO - это просто класс с только частными полями и общедоступными методами getter/setter. Джексон будет проходить методы (используя отражение) и сопоставляет объект JSON в экземпляр POJO, поскольку имена полей класса соответствуют именам полей объекта JSON.
В вашем объекте JSON, который на самом деле является составным объектом, главный объект состоит из двух под-объектов. Итак, наши классы POJO должны иметь одинаковую иерархию. Я буду называть весь объект JSON объектом Page. Страница состоит из объекта PageInfo и массива объектов Опубликовать.
Итак, нам нужно создать три разных класса POJO:
Единственным пакетом, который я использовал, является Jackson ObjectMapper, то, что мы делаем, является обязательными данными;
com.fasterxml.jackson.databind.ObjectMapper
Необходимые зависимости, файлы jar перечислены ниже;
Вот требуемый код:
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;
}
}
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;
}
}
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;
}
}
Я только что скопировал ваш образец 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"
}
]
}
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());
}
}
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
Вы можете использовать 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, используя онлайн-инструменты, подобные этому.
Используйте минимальный 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>
Я считаю, что наилучшей практикой должно быть пройти официальное Java JSON API, которое все еще продолжается.
В приведенном ниже примере показано, как читать текст в вопросе, представленный как переменная 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-обработки.
Это смутило меня с легкостью. Вы можете просто передать String
, удерживая JSON в конструкторе JSONObject в пакете org.json по умолчанию.
JSONArray rootOfPage = new JSONArray(JSONString);
Готово. Капельки микрофона.
Это работает и с JSONObjects
. После этого вы можете просто просмотреть свою иерархию Objects
с помощью методов get()
на ваших объектах.
JSONArray
не является частью JSONArray
API J2SE, и вы не говорите, какой API или сторонняя библиотека предоставляет этот тип.
Поскольку никто еще не упомянул об этом, вот начало решения с использованием 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. В зависимости от ваших требований Джексон и Нашорн могут быть жизнеспособными решениями.
"
"? Не дюймы? Это секунды? Минуты?
В 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 с помощью 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.
}
}
Сообщите мне, если у вас есть какие-либо вопросы.
В дополнение к другим ответам, я рекомендую эту онлайн-службу с открытым исходным кодом 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;
}
Если у вас есть Java-класс (например, Message), представляющий строку JSON (jsonString), вы можете использовать библиотеку Jackson JSON с:
Message message= new ObjectMapper().readValue(jsonString, Message.class);
и из объекта сообщения вы можете получить любой из его атрибутов.
Существует множество библиотек с открытым исходным кодом для анализа содержимого JSON для объекта или просто для чтения значений JSON. Ваше требование состоит в том, чтобы просто считывать значения и анализировать их на пользовательский объект. Так что в вашем случае достаточно библиотеки org.json.
Используйте библиотеку org.json для ее анализа и создания JsonObject:
JSONObject jsonObj = new JSONObject(<jsonStr>);
Теперь используйте этот объект для получения ваших значений:
String id = jsonObj.getString("pageInfo");
Здесь вы можете увидеть полный пример:
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();
}
}
}
`
Вы можете использовать библиотеку 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 с помощью Jackson: https://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/ p >
Надеюсь, что это поможет!
Лучшие ответы на этой странице используют слишком простые примеры, такие как объект с одним свойством (например, {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;
Прочтите следующее сообщение в блоге 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");
Вы можете использовать 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
У меня 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
}
jsoniter
(jsoniterator) - относительно новая и простая библиотека json, разработанная для простой и быстрой работы. Все, что вам нужно сделать для десериализации данных json, - это
JsonIterator.deserialize(jsonData, int[].class);
где jsonData
- это строка json-данных.
Ознакомьтесь с официальным сайтом для получения дополнительной информации.
Прежде всего это не действительные данные json.
Вы должны поместить запятую между двумя элементами json pageInfo
и posts
.
Вот действительный 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"
}
]
}
Теперь вы можете разобрать его с помощью любого из описанных выше методов или если вы реализуете эту библиотеку, тогда это лучше всего.
Можно использовать 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, показывающий аналогичный пример вместе с асинхронной сетевой связью.
Как и спрашивал @Gioele Costa, и он был отмечен как дубликат, я отвечу здесь:
Предположим, что этот ответ от бэкэнд
{"OK":[{"tavolo":"1","pizza":"magherita","quantita":"12","note":"nothing"},{"tavolo":"1","pizza":"4formaggi","quantita":"1","note":"nothing"}],"success":1}
После использования функции backend - frontend и json parser
$result = mysql_query(your query);
if (mysql_num_rows($result) > 0) {
$response["OK"] = array();
while ($row = mysql_fetch_array($result)) {
// temp user array
$product = array();
$product["tavolo"] = $row["tavolo"];
$product["pizza"] = $row["pizza"];
$product["quantita"] = $row["quantita"];
$product["note"] = $row["note"];
// push single product into final response array
array_push($response["OK"], $product);
}
// success
$response["success"] = 1;
// echoing JSON response
echo json_encode($response);
}
Я использовал AsyncTask для реализации клиентской части программного обеспечения
//your activity..
final String url_all_products = "yoururl.something";
// JSON Node names
final String TAG_SUCCESS = "success";
//Row is your bean
ArrayList<Row> productsList;
// products JSONArray
JSONArray products = null;
JSONParser jParser = new JSONParser();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new LoadAllProducts().execute();
}
/**
* Background Async Task
* */
class LoadAllProducts extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
// do something
}
protected String doInBackground(String... args) {
JSONObject json = jParser.makeHttpRequest(url_all_products, "GET");
try {
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
products = json.getJSONArray("OK");
productsList = new ArrayList<Row>();
// looping through All Products
for (int i = 0; i < products.length(); i++) {
JSONObject c = products.getJSONObject(i);
Row r = new Row();
r.setDescription(c.getString("tavolo"));
r.setLat(c.getString("pizza"));
r.setLon(c.getString("quantita"));
r.setGame_sequence(c.getString("note"));
productsList.add(r);
}
}else {/*do something*/}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url) {
// do something
}
}
}
}
Класс JSONParser (отметить, что клиент Apache Http больше не поддерживается)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
// function get json from url
// by making HTTP POST or GET mehtod
public JSONObject makeHttpRequest(String url, String method) {
// Making HTTP request
try {
// check for request method
if("POST".equals(method)){
// request method is POST
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}else if("GET".equals(method)){
// request method is GET
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
is.close();
json = sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
e.printStackTrace();
}
return jObj;
}
}
Мы можем использовать класс 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));
}
}
Вы можете использовать JsonNode
для структурированного древовидного представления вашей строки JSON. Это часть обширной рок- джексон-библиотеки, которая вездесуща.
ObjectMapper mapper = new ObjectMapper();
JsonNode yourObj = mapper.readTree("{\"k\":\"v\"}");
Вам нужно использовать класс JsonNode и ObjectMapper из библиотеки jackson для извлечения узлов вашего дерева Json. Добавьте следующую зависимость в свой pom.xml, чтобы получить доступ к классам Jackson.
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
Вы должны попробовать по нижеследующему коду, это сработает:
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
Class JsonNodeExtractor{
public void convertToJson(){
String filepath = "c:\\data.json";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(filepath);
// create a JsonNode for every root or subroot element in the Json String
JsonNode pageInfoRoot = node.path("pageInfo");
// Fetching elements under 'pageInfo'
String pageName = pageInfoRoot.path("pageName").asText();
String pagePic = pageInfoRoot.path("pagePic").asText();
// Now fetching elements under posts
JsonNode postsNode = node.path("posts");
String post_id = postsNode .path("post_id").asText();
String nameOfPersonWhoPosted = postsNode
.path("nameOfPersonWhoPosted").asText();
}
}