Как разобрать JSON в Java - PullRequest
933 голосов
/ 07 апреля 2010

У меня есть следующий текст 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"
         }
    ]
}

Ответы [ 31 ]

678 голосов
/ 25 сентября 2013

Библиотека 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");
    ......
}

Вы можете найти больше примеров: Разбор JSON на Java

Загружаемые баночки: http://mvnrepository.com/artifact/org.json/json

492 голосов
/ 31 июля 2015

Для примера давайте предположим, что у вас есть класс 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

Орг.JSON ( Maven )

Если вам не нужна десериализация объекта, а требуется просто получить атрибут, вы можете попробовать org.json ( или посмотреть GSON пример выше! )

JSONObject obj = new JSONObject("{\"name\": \"John\"}");

System.out.println(obj.getString("name")); //John

Джексон ( Maven )

ObjectMapper mapper = new ObjectMapper();
Person user = mapper.readValue("{\"name\": \"John\"}", Person.class);

System.out.println(user.name); //John
94 голосов
/ 19 февраля 2015
  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");
    
70 голосов
/ 24 февраля 2013

анализатор quick-json очень простой, гибкий, очень быстрый и настраиваемый. Попробуй

Особенности:

  • Соответствует спецификации JSON (RFC4627)
  • Высокопроизводительный анализатор JSON
  • Поддерживает гибкий / настраиваемый подход к синтаксическому анализу
  • Настраиваемая проверка пар ключ / значение любой иерархии JSON
  • Простота в использовании # Очень маленькая площадь
  • Повышает удобство для разработчиков и легко отслеживает исключения
  • Подключаемая поддержка пользовательской проверки - ключи / значения могут быть проверены путем настройки пользовательских средств проверки по мере их появления
  • Проверка и не проверка поддержки парсера
  • Поддержка двух типов конфигурации (JSON / XML) для использования анализатора быстрой проверки JSON
  • Требуется JDK 1,5
  • Нет зависимости от внешних библиотек
  • Поддержка генерации JSON через сериализацию объектов
  • Поддержка выбора типа коллекции во время анализа

Может использоваться следующим образом:

JsonParserFactory factory=JsonParserFactory.getInstance();
JSONParser parser=factory.newJsonParser();
Map jsonMap=parser.parseJson(jsonString);
35 голосов
/ 12 июля 2016

A - Объяснение

Вы можете использовать библиотеки Джексона , чтобы связать строку JSON в POJO ( Обычный старый объект Java ). POJO - это просто класс с только закрытыми полями и общедоступными методами получения / установки. Джексон собирается просмотреть методы (используя отражение ) и сопоставить объект JSON с экземпляром POJO, поскольку имена полей класса соответствуют именам полей объекта JSON.

В вашем объекте JSON, который на самом деле является составным объектом, главный объект состоит из двух подобъектов. Итак, наши классы POJO должны иметь одинаковую иерархию. Я назову весь JSON-объект как Page объект. Объект 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: Пост

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
33 голосов
/ 16 декабря 2015

Практически для всех приведенных ответов требуется полная десериализация 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.

29 голосов
/ 01 июня 2016

Вы можете использовать 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 с помощью онлайн-инструментов, таких как this .

22 голосов
/ 15 августа 2016

Используйте 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>
19 голосов
/ 08 апреля 2013

Я полагаю, что лучшая практика должна заключаться в официальном Java JSON API , которые все еще находятся в процессе разработки.

18 голосов
/ 03 мая 2016

В приведенном ниже примере показано, как читать текст вопроса, представленный в виде переменной "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 сторонних производителей. осуществление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...