Как разбить формат String JSON как конструкторы объекта в Java? [Дубликат]

Мы много говорили об этом в комментариях к моему предыдущему сообщению, но я не хочу, чтобы это затерялось на странице 3 комментариев: вы должны установить локаль, она работает как с входом с R-консоли ( см. скриншот в комментариях), а также со входом из файла см. этот снимок экрана:

[/g0]

Файл «myfile.r» содержит:

russian <- function() print ("Американские с...");

Консоль содержит:

source("myfile.r", encoding="utf-8")
> Error in source(".....
Sys.setlocale("LC_CTYPE","ru")
> [1] "Russian_Russia.1251"
russian()
[1] "Американские с..."

Обратите внимание, что файл не работает и указывает на тот же символ, что и ошибка оригинального плаката (после «R»). сделайте это с китайцами, потому что мне нужно будет установить «Microsoft Pinyin IME 3.0», но процесс тот же, вы просто замените локаль на «китайский» (именование немного противоречиво, обратитесь к документации).

808
задан Mark Amery 5 February 2018 в 13:52
поделиться

28 ответов

Вам нужно использовать класс JsonNode и ObjectMapper из библиотеки jackson для извлечения узлов вашего дерева Json. Добавьте следующую зависимость в свой pom.xml, чтобы получить доступ к классам Джексона.

<!-- 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
ответ дан Akash Roy 15 August 2018 в 21:58
поделиться
  • 1
    Как вы можете анализировать объекты json без чтения из файла? – bademba 16 June 2018 в 10:04
  • 2
    @bademba: Если у вас есть сырой json для синтаксического анализа, вы можете определить соответствующее Pojo для json. – Akash Roy 19 June 2018 в 05:06
  • 3
    Привет @Akash, у меня есть соответствующие классы getters и seters, но я получаю нулевые значения. Не могли бы вы поделиться с ним частью кода? – bademba 19 June 2018 в 05:12
  • 4
    конечно! @bademba String mobileJson = & quot; {\ & quot; бренд \ & quot; : \ & quot; Apple \ & quot ;, \ & quot; Цена \ & quot; : 1000} & quot ;; // используйте Reader Reader Reader Reader = новый StringReader (mobileJson); ObjectMapper mapper = new ObjectMapper (); Mobile mobile = mapper.readValue (читатель, Mobile.class); – Akash Roy 19 June 2018 в 06:05
  • 5
    позвольте мне попробовать – bademba 19 June 2018 в 07:54

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

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 /

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

3
ответ дан Community 15 August 2018 в 21:58
поделиться
  • 1
    Вы указываете на версию 1 библиотеки Джексона. Настоятельно рекомендуем использовать текущую версию библиотеки Джексона. – Herbert Yu 22 August 2017 в 00:58

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

26
ответ дан dade 15 August 2018 в 21:58
поделиться

На Java существует множество библиотек JSON.

Наиболее известными являются: Джексон, GSON, Genson, FastJson и org.json.

Обычно есть три вещи следует искать для выбора любой библиотеки:

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

В частности, для библиотек JSON (и любых сериализационных / десериализационных библиотек) также важна привязка данных, поскольку она устраняет необходимость написания кода котельной пластины для упаковки / распаковки данных.

Для 1 см. этот тест: https://github.com/fabienrenaud/java-json-benchmark Я использовал JMH , который сравнивает (jackson, 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.
    }
}

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

7
ответ дан fabien 15 August 2018 в 21:58
поделиться

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

15
ответ дан Iharob Al Asimi 15 August 2018 в 21:58
поделиться
  • 1
    Поскольку я ответил, я начал использовать Jackson , и я думаю, что это одна из лучших библиотек для де-сериализации JSON. – Giovanni Botta 11 September 2014 в 15:26
  • 2
    Почему они повторно используют JSONP для обозначения чего-то другого, чем JSON с Padding ? ... – Chris Wesseling 14 May 2015 в 05:53
  • 3
    @ChrisWesseling Что ты имеешь в виду? – Giovanni Botta 14 May 2015 в 18:43
  • 4
    «API Java для обработки JSON (JSON-P)» это название документа, на который вы ссылаетесь. И это смутило меня, потому что я знал, что JSONP означает что-то еще. – Chris Wesseling 14 May 2015 в 18:48
  • 5
    @ChrisWesseling о, это сбивает с толку. Это то, что они выбрали для спецификации. Однако, как я уже сказал, я бы пошел прямо в Джексон. – Giovanni Botta 14 May 2015 в 18:50

Для примера предположим, что у вас есть класс 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 выше!) [/ ​​g13]

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
412
ответ дан jake stayman 15 August 2018 в 21:58
поделиться
  • 1
    Хороший ответ. Одно из предположений о незначительном улучшении: и GSON, и Jackson также поддерживают использование представления дерева JSON (для Джексона это JsonNode s, у GSON есть нечто подобное). Может быть полезно показать фрагменты, так как это похоже на единственный способ, предлагаемый org.json. – StaxMan 6 October 2015 в 18:05
  • 2
    Две другие библиотеки, которые стоит упомянуть (в интересах полноты): json-simple и Oracle JSONP – jake stayman 1 April 2016 в 19:04
  • 3
    @NeonWarge, почему? Мне кажется, что этот ответ предполагает, что он уже определил класс Java, который содержит точно те же поля, что и строка JSON, не меньше и ничего больше. Это довольно сильное предположение. – Andrea Lazzarotto 9 April 2016 в 20:40
  • 4
    json-simple и jsonp оракула исполняют ужасно: github.com/fabienrenaud/java-json-benchmark Для производительности выберите jackson или dsljson. – fabien 1 August 2016 в 01:04
  • 5
    GSON не поддерживает динамическую фильтрацию полей на уровнях, отличных от root! – Gangnus 6 August 2016 в 14:02

Можно использовать аннотацию 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
ответ дан Jaroslav Tulach 15 August 2018 в 21:58
поделиться

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

JSONArray rootOfPage =  new JSONArray(JSONString);

Выполнено. Отбрасывает микрофон . Это также работает с JSONObjects. После этого вы можете просто просмотреть свою иерархию Objects, используя методы get() на ваших объектах.

10
ответ дан jpaugh 15 August 2018 в 21:58
поделиться
  • 1
    Тип JSONArray не является частью J2SE JDK API, и вы не говорите, какой API или сторонняя библиотека предоставляет этот тип. – Bobulous 24 April 2015 в 22:22
  • 2
    Не то, чтобы я рекомендовал его использовать, но я думаю, что это относится к & quot; org.json & quot; пакет из json.org/java . Раньше это использовалось до того, как появились хорошие библиотеки Java, но это было много лет назад (2008 или раньше) – StaxMan 1 June 2015 в 23:11
  • 3
    Или мозговой мозг1 означает JSONArray в Android? – Alexander Farber 21 February 2018 в 14:44

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

13
ответ дан justin.hughey 15 August 2018 в 21:58
поделиться
  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");
    
69
ответ дан L Joey 15 August 2018 в 21:58
поделиться
  • 1
    @nondescript Если бы я должен был догадаться, я бы сказал, что он был занижен, потому что он не отвечает на вопрос оригинального плаката: & quot; Что такое требуемый код? & quot; Ответы, которые были поддержаны, предоставили фрагменты кода. – jewbix.cube 27 April 2015 в 21:40
  • 2
    Примечание. Джексон и GSON поддерживают привязку древовидного стиля и / или привязки к картам / спискам, поэтому нет необходимости использовать пакет Java EE (javax.json). javax.json не может предложить ни Джексона, ни GSON. – StaxMan 1 June 2015 в 23:10
  • 3
    Я предлагаю добавить ссылку на библиотеку JavaEE. – Basil Bourque 26 May 2018 в 06:25

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

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

В вашем объекте JSON, который на самом деле является составным объектом, основной объект состоит из двух под-объектов. Итак, наши классы POJO должны иметь одинаковую иерархию. Я назову весь объект JSON как объект страницы. Объект страницы состоит из объекта PageInfo и массива объектов Post.

Итак, мы должны создать три разных класса POJO:

  • Класс страницы, составной элемент PageInfo Class и массив сообщений экземпляров
  • PageInfo Class
  • Posts Class

Единственным пакетом, который я использовал, является Jackson ObjectMapper, то, что мы делаем, является обязательными данными ;

com.fasterxml.jackson.databind.ObjectMapper

Необходимые зависимости, файлы jar перечислены ниже:

  • jackson-core-2.5.1.jar
  • jackson- databind-2.5.1.jar
  • jackson-annotations-2.5.0.jar

Вот требуемый код:

B - Main 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
25
ответ дан Levent Divilioglu 15 August 2018 в 21:58
поделиться

Вы можете использовать библиотеку 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
}
5
ответ дан LittleBigUllah 15 August 2018 в 21:58
поделиться
{
   "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
}
3
ответ дан LReddy 15 August 2018 в 21:58
поделиться

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

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

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

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

JsonParserFactory factory=JsonParserFactory.getInstance();
JSONParser parser=factory.newJsonParser();
Map jsonMap=parser.parseJson(jsonString);
62
ответ дан mukesh krishnan 15 August 2018 в 21:58
поделиться
  • 1
    Есть ли доступный javadoc? – jboi 10 September 2013 в 12:38
  • 2
    Этот пакет не может обрабатывать пустые значения при разборе. Например: ... & quot; описание & quot; & quot; & quot; & quot; & quot; ... бросает исключение – Ivan 25 October 2013 в 16:45
  • 3
    Я исправил эту проблему (и многие другие) в code.google.com/p/quick-json/issues/detail?id=11 Я надеюсь, что автор даст время, чтобы исправить это в официальном выпуске. – noamik 8 August 2014 в 13:28
  • 4
    Из перечисленных функций ничто не является уникальным по сравнению с другими вариантами - и утверждение о высокой производительности ничем не поддерживается; в отличие от более зрелых библиотек (Gson, Jackson, Genson, Boon), которые включены в такие тесты, как github.com/eishay/jvm-serializers , github.com/novoj/JavaJsonPerformanceTest или developer.com/lang/jscript/… - Я не видел эту библиотеку, включенную в тесты, или упоминания о ее широко используемой. – StaxMan 24 October 2014 в 06:12
  • 5
    Этот проект кажется мертвым и, похоже, больше не размещается в центральном репозитории Maven. – 8bitjunkie 8 November 2015 в 23:16

Поскольку никто еще не упомянул об этом, вот начало решения, использующего Nashorn (часть выполнения JavaScript для Java 8).

Решение

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

11
ответ дан otonglet 15 August 2018 в 21:58
поделиться
  • 1
    Что такое единица & quot; " & quot ;? Не дюймы? Это секунды? Минуты? – Peter Mortensen 4 February 2018 в 19:55
  • 2
    @PeterMortensen означает секунды. Поскольку это кажется неясным, я изменю его. Спасибо за обзор. – otonglet 5 February 2018 в 10:18
  • 3
    – Per Mildner 25 October 2018 в 13:14

Пожалуйста, сделайте что-то вроде этого:

JSONParser jsonParser = new JSONParser();
JSONObject obj = (JSONObject) jsonParser.parse(contentString);
String product = (String) jsonObject.get("productId");
4
ответ дан Pang 15 August 2018 в 21:58
поделиться

Библиотека 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 / артефакт / org.json / JSON

583
ответ дан Pavneet_Singh 15 August 2018 в 21:58
поделиться
  • 1
    Я согласен с @StaxMan. Я просто попробовал org.json, и это ужасно громоздко. Например, он не играет со стандартными типами Java Collection. – Ken Williams 12 November 2014 в 17:55
  • 2
    @StaxMan Я бы выбрал org.json над другими библиотеками для простого разбора JSON, даже не глядя. Это справочная библиотека, созданная Дугласом Крокфордом (создателем JSON). – Omar Al-Ithawi 17 November 2015 в 16:49
  • 3
    @OmarIthawi, это просто глупо. Это доказательство концепции с неудобным API, неэффективная реализация. Я думаю, что лучше рассматривать библиотеки по существу, вместо того, чтобы пытаться вывести качество из своей видимости своих авторов - Дуг многое сделал, но на самом деле это не меняет качества конкретной библиотеки. 10 лет назад это была единственная игра в городе, но с тех пор был достигнут значительный прогресс. Это как Struts из json libs. – StaxMan 19 November 2015 в 19:54
  • 4
    org.json входит в число самых худших json-библиотек. Перед выбором нужно посмотреть набор функций и производительность доступных json-библиотек. Вот сравнительный тест, который я сравнивал с Jackson, gson, org.json, genson, используя JMH: github.com/fabienrenaud/java-json-benchmark . Джексон - явный победитель здесь. – fabien 27 June 2016 в 20:53
  • 5
    Лицензия не включает в себя широко распространенное лицензирование с открытым исходным кодом, а также содержит авторские права. – Christian Vielma 11 August 2016 в 14:43

Мы можем использовать класс 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));
  }
}
21
ответ дан Peter Mortensen 15 August 2018 в 21:58
поделиться
  • 1
    Кажется, что все ваши ответы содержат ссылку на этот сайт. Если это спам, остановитесь. Если это не так, извините за путаницу, но я не думаю, что вам нужно опубликовать ссылку во всех ваших ответах. – Donald Duck 3 March 2017 в 13:43
  • 2
    Его трудно дать ответ, где вы можете объяснить все сценарии. Как в этом случае, как читать json-массив или несколько json-объектов. Даже если я это сделаю, ответ будет очень долгим, и человек может запутаться. Поэтому я даю ссылку, где дается правильное объяснение, с надлежащим примером. Он может посещать или использовать только мое объяснение. – lalitbhagtani 3 March 2017 в 13:51
  • 3
    Как будет выглядеть pojo? – Jesse 29 March 2017 в 15:24
  • 4
    Для Pojo используйте gson. Эта библиотека не поддерживает. – Sakib Sami 29 March 2017 в 20:01
  • 5
    Это только андроид – Ľubomír 5 May 2017 в 16:01
  • 6
    Это не просто андроид: docs.oracle.com/javaee/7/api/javax/json/JsonObject.html – Dermot Canniffe 7 September 2017 в 09:47
  • 7
    Мне кажется, что ссылка, которую вы предоставили, только демонстрирует, как читать JSON. Где я могу найти информацию о том, как JSON? – Lampros Tzanetos 27 October 2017 в 12:53
  • 8
    @DermotCanniffe это просто Android. – user4020527 28 October 2017 в 05:29
  • 9
    Извините, но я не понял ваш вопрос: «& quot; о том, как JSON также & quot; – lalitbhagtani 31 October 2017 в 08:56

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

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

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

7
ответ дан StaxMan 15 August 2018 в 21:58
поделиться

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
ответ дан venkat 15 August 2018 в 21:58
поделиться

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

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;
}
7
ответ дан Viacheslav Vedenin 15 August 2018 в 21:58
поделиться

В главных ответах на этой странице используются слишком простые примеры, такие как объект с одним свойством (например, {name: value}). Я думаю, что простой, но реальный пример жизни может помочь кому-то.

Итак, это JSON, возвращенный API-интерфейсом Google Translate:

{
  "data": 
     {
        "translations": 
          [
            {
              "translatedText": "Arbeit"
             }
          ]
     }
}

Я хочу получить значение атрибута «translText», например. «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;
    
3
ответ дан yurin 15 August 2018 в 21:58
поделиться
21
ответ дан Peter Mortensen 5 September 2018 в 21:40
поделиться
22
ответ дан lubilis 29 October 2018 в 04:54
поделиться
21
ответ дан Peter Mortensen 29 October 2018 в 04:54
поделиться
0
ответ дан SirGoPythonJavaCppRuby the 3rd 29 October 2018 в 04:54
поделиться
21
ответ дан Peter Mortensen 29 October 2018 в 04:54
поделиться
0
ответ дан SirGoPythonJavaCppRuby the 3rd 29 October 2018 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: