Как разобрать 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
  1. Если кто-то хочет создать объект 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);
    
  2. Но если нужно просто проанализировать строку 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.

Как правило, есть три вещи, на которые следует обратить внимание при выборе любой библиотеки:

  1. Спектакль
  2. Простота использования (код прост для написания и разборчивый) - это идет с функциями.
  3. Для мобильных приложений: размер зависимости / размер фляги

В частности, для библиотек 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

Прочитайте следующий пост в блоге, 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.

Два возможных подхода:

  1. Получить только один необходимый атрибут

    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();
    
  2. Создать объект 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 для решения проблемы.

  1. convert your json object to java object
  2. вы можете использовать эту ссылку или любой онлайн https://json2csharp.com/json-to-pojo
  3. Сохраните как класс Java, например Myclass.java
  4. Myclass obj=new Gson().fromJson(JsonStr, Myclass.class);
  5. используя объект, вы можете получить свои значения.

Если у вас есть проект 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.

Другие вопросы по тегам