Как разобрать 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 ]

14 голосов
/ 08 февраля 2017

Поскольку никто еще не упомянул об этом, вот начало решения, использующего 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};

Выполнение вызова миллион раз с использованием Нашорн занимает 7,5 ~ 7,8 секунды

(JSObject) invocable.invokeFunction("fun", json);

org.json занимает 20 ~ 21 секунд

new JSONObject(JSON).getJSONArray("entries");

Джексон занимает 6,5 ~ 7 секунд

mapper.readValue(JSON, Entries.class).getEntries();

В этом случае Джексон работает лучше, чем Nashorn, который работает намного лучше, чем org.json. API Nashorn сложнее в использовании, чем в org.json или Jackson's. В зависимости от ваших требований Джексон и Нашорн могут быть жизнеспособными решениями.

14 голосов
/ 15 мая 2014

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

JSONArray rootOfPage =  new JSONArray(JSONString);

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

12 голосов
/ 27 июня 2016

В Java доступно много библиотек JSON.

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

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

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

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

Для 1 см. Этот тест: https://github.com/fabienrenaud/java-json-benchmark Я использовал JMH , который сравнивает (Джексон, Джсон, Дженсон, Fastjson, Org.json, JSONP) производительность сериализаторов идесериализаторы, использующие API потоков и связей данных.Для 2 вы можете найти множество примеров в Интернете.Вышеприведенный тест также может быть использован в качестве источника примеров ...

Быстрый анализ производительности: Джексон работает в 5-6 раз лучше, чем org.json, и более чем в два раза лучше, чемGSON.

Для вашего конкретного примера следующий код расшифровывает ваш JSON с Джексоном:

public class MyObj {

    private PageInfo pageInfo;
    private List<Post> posts;

    static final class PageInfo {
        private String pageName;
        private String pagePic;
    }

    static final class Post {
        private String post_id;
        @JsonProperty("actor_id");
        private String actorId;
        @JsonProperty("picOfPersonWhoPosted")
        private String pictureOfPoster;
        @JsonProperty("nameOfPersonWhoPosted")
        private String nameOfPoster;
        private String likesCount;
        private List<String> comments;
        private String timeOfPost;
    }

    private static final ObjectMapper JACKSON = new ObjectMapper();
    public static void main(String[] args) throws IOException {
        MyObj o = JACKSON.readValue(args[0], MyObj.class); // assumes args[0] contains your json payload provided in your question.
    }
}

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

9 голосов
/ 03 марта 2017

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

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

JSONObject jsonObj = new JSONObject(<jsonStr>);

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

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

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

Как анализировать JSON в Java

9 голосов
/ 29 августа 2015

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

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

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

9 голосов
/ 17 декабря 2015

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

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

    }
}

`

7 голосов
/ 14 июля 2015

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

JSONParser jsonParser = new JSONParser();
JSONObject obj = (JSONObject) jsonParser.parse(contentString);
String product = (String) jsonObject.get("productId");
6 голосов
/ 19 октября 2017

Вы можете использовать библиотеку 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 голосов
/ 22 марта 2016

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

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

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