Как разобрать JSON в Java

848

У меня есть следующий текст 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"
         }
    ]
}
  • 2
    androidbeasts.wordpress.com/2015/08/04/json-parsing-tutorial : попробуйте это
  • 6
    Встроенные в JSON библиотеки java - это метод квикетов, но по моему опыту GSON - лучшая библиотека для безболезненного разбора JSON в POJO.
Показать ещё 9 комментариев
Теги:
parsing

32 ответа

665

Библиотека 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

  • 11
    Я согласен с @StaxMan. Я только что попробовал org.json, и это ужасно громоздко. Например, он не работает со стандартными типами Java Collection.
  • 7
    @StaxMan Я бы предпочел org.json другим библиотекам для простого анализа JSON, даже не глядя. Это справочная библиотека, созданная Дугласом Крокфордом (первооткрывателем JSON).
Показать ещё 9 комментариев
473

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

Jackson (Maven)

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

System.out.println(user.name); //John
  • 13
    Хороший ответ. Одно предложение для незначительного улучшения: и GSON, и Джексон также поддерживают использование представления дерева JSON (для Джексона это JsonNode , GSON имеет нечто похожее). Может быть хорошо показывать фрагменты, так как это похоже на единственный способ, который предлагает org.json.
  • 0
    Стоит упомянуть еще две библиотеки (в интересах полноты): json-simple и Oracle JSONP
Показать ещё 5 комментариев
77
  1. Если вы хотите создать объект 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);
    
  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");
    
  • 4
    @nondescript Если бы мне пришлось угадывать, я бы сказал, что за него проголосовали, потому что он не отвечает на вопрос оригинального автора: «Что такое требуемый код?» Ответы, которые были отклонены, предоставили фрагменты кода.
  • 4
    Примечание. Jackson и GSON поддерживают привязку в виде дерева и / или привязку Maps / Lists, поэтому нет необходимости использовать пакет Java EE (javax.json). javax.json мало что может предложить помимо Джексона или GSON.
Показать ещё 1 комментарий
70

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);
  • 3
    Есть ли доступный Javadoc?
  • 21
    Этот пакет не может обрабатывать пустые значения при разборе. Например: ... "description": "" ... выдает исключение
Показать ещё 7 комментариев
32

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

28

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
23

Вы можете использовать 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, используя онлайн-инструменты, подобные этому.

21

Используйте минимальный 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>
  • 0
    Как будет выглядеть Pojo?
  • 0
    Для Pojo используйте gson. Эта библиотека не поддерживает.
18

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

  • 7
    С тех пор как я ответил, я начал использовать Джексона, и я думаю, что это одна из лучших библиотек для десериализации JSON.
  • 2
    Почему они повторно используют JSONP для обозначения чего-то отличного от JSON с Padding ? ...
Показать ещё 4 комментария
16

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

12

Это смутило меня с легкостью. Вы можете просто передать String, удерживая JSON в конструкторе JSONObject в пакете org.json по умолчанию.

JSONArray rootOfPage =  new JSONArray(JSONString);

Готово. Капельки микрофона. Это работает и с JSONObjects. После этого вы можете просто просмотреть свою иерархию Objects с помощью методов get() на ваших объектах.

  • 10
    Тип JSONArray не является частью JSONArray API J2SE, и вы не говорите, какой API или сторонняя библиотека предоставляет этот тип.
  • 2
    Не то, чтобы я рекомендовал использовать его, но я думаю, что это относится к пакету "org.json" от json.org/java . Раньше он использовался до того, как стали доступны хорошие библиотеки Java, но это было много лет назад (2008 или раньше)
Показать ещё 1 комментарий
10

Поскольку никто еще не упомянул об этом, вот начало решения с использованием 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. В зависимости от ваших требований Джексон и Нашорн могут быть жизнеспособными решениями.

  • 1
    Что такое единица измерения " " "? Не дюймы? Это секунды? Минуты?
  • 1
    @PeterMortensen это означает секунды. Поскольку это кажется неясным, я изменю это. Спасибо за обзор.
Показать ещё 1 комментарий
9

В 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.
    }
}

Сообщите мне, если у вас есть какие-либо вопросы.

8

В дополнение к другим ответам, я рекомендую эту онлайн-службу с открытым исходным кодом 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;
}
8

Если у вас есть Java-класс (например, Message), представляющий строку JSON (jsonString), вы можете использовать библиотеку Jackson JSON с:

Message message= new ObjectMapper().readValue(jsonString, Message.class);

и из объекта сообщения вы можете получить любой из его атрибутов.

7

Существует множество библиотек с открытым исходным кодом для анализа содержимого JSON для объекта или просто для чтения значений JSON. Ваше требование состоит в том, чтобы просто считывать значения и анализировать их на пользовательский объект. Так что в вашем случае достаточно библиотеки org.json.

Используйте библиотеку org.json для ее анализа и создания JsonObject:

JSONObject jsonObj = new JSONObject(<jsonStr>);

Теперь используйте этот объект для получения ваших значений:

String id = jsonObj.getString("pageInfo");

Здесь вы можете увидеть полный пример:

Как разбирать JSON в Java

  • 0
    Кажется, что все ваши ответы содержат ссылку на этот сайт. Если это спам, пожалуйста, прекратите. Если это не так, извините за путаницу, но я не думаю, что необходимо размещать ссылку во всех ваших ответах.
  • 1
    Трудно дать ответ, где вы можете объяснить все сценарии. Как в этом случае, как читать массив JSON или несколько объектов JSON. Даже если я сделаю это, ответ будет очень длинным, и человек может запутаться. Поэтому я даю ссылку, где дано правильное объяснение, с соответствующим примером. Он может выбрать посещение или может использовать только мое объяснение.
Показать ещё 2 комментария
7

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();
    }

    }
}

`

6

Вы можете использовать библиотеку 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
}
4

Сначала вам нужно выбрать библиотеку реализации.

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 >

Надеюсь, что это поможет!

  • 0
    Вы указываете на версию 1 библиотеки Джексона. Настоятельно рекомендуем использовать текущую версию библиотеки Джексона.
4

Лучшие ответы на этой странице используют слишком простые примеры, такие как объект с одним свойством (например, {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;
    
4

Прочтите следующее сообщение в блоге 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();
}

Для получения дополнительной информации вы можете обратиться к следующей ссылке.

4

Прошу сделать что-то вроде этого:

JSONParser jsonParser = new JSONParser();
JSONObject obj = (JSONObject) jsonParser.parse(contentString);
String product = (String) jsonObject.get("productId");
  • 7
    Э-э, какая это библиотека?
  • 1
    Я думаю, что он использует org.json.simple
3

Вы можете использовать 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
2

У меня 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>
2
{
   "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
}
  • 7
    Пожалуйста, объясните свой ответ, так как ответы только для кода помогают другим гораздо меньше, чем хорошо документированный код. Смотрите: «дай человеку рыбу, и ты накормишь его на день; научи человека ловить рыбу, и ты накормишь его на всю жизнь» .
  • 0
    Было бы хорошо упомянуть, что это для lib 'org.json'. Однако я не думаю, что это хороший способ сделать это, будучи очень многословным, а сама библиотека org.json устарела (медленный, громоздкий API). Есть лучший выбор: GSON, Джексон, Бун, Дженсон, чтобы использовать.
0

jsoniter (jsoniterator) - относительно новая и простая библиотека json, разработанная для простой и быстрой работы. Все, что вам нужно сделать для десериализации данных json, - это

JsonIterator.deserialize(jsonData, int[].class);

где jsonData - это строка json-данных.

Ознакомьтесь с официальным сайтом для получения дополнительной информации.

0

Прежде всего это не действительные данные 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"
         }
    ]
}

Теперь вы можете разобрать его с помощью любого из описанных выше методов или если вы реализуете эту библиотеку, тогда это лучше всего.

  • 0
    Я думаю, что вы здесь упускаете смысл. И поскольку я пошел дальше и отредактировал исходный вопрос, чтобы исправить JSON, я не думаю, что этот пост добавляет какую-либо ценность. Пожалуйста, рассмотрите возможность удаления.
0

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

0

Как и спрашивал @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; 
    }
}
0

Мы можем использовать класс 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));
  }
}
  • 2
    Это только андроид
  • 0
    Это не только Android: docs.oracle.com/javaee/7/api/javax/json/JsonObject.html
Показать ещё 1 комментарий
0

Вы можете использовать JsonNode для структурированного древовидного представления вашей строки JSON. Это часть обширной рок- джексон-библиотеки, которая вездесуща.

ObjectMapper mapper = new ObjectMapper();
JsonNode yourObj = mapper.readTree("{\"k\":\"v\"}");
-2

Вам нужно использовать класс 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();

}
}
  • 1
    Как вы можете анализировать объекты JSON без чтения из файла?
  • 1
    @bademba: Если у вас есть необработанный json для анализа, вы можете определить соответствующее Pojo для json.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню