Cara mengurai JSON di Jawa

1049

Saya memiliki teks JSON berikut. Bagaimana saya bisa mengurai untuk mendapatkan nilai-nilai pageName, pagePic, post_id, dll?

{
   "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"
         }
    ]
}
Muhammad Maqsoodur Rehman
sumber
7
Java yang dibangun di perpustakaan JSON adalah cara cepat untuk melakukannya, tetapi dalam pengalaman saya GSON adalah perpustakaan terbaik untuk mem-parsing JSON menjadi POJO tanpa rasa sakit.
Iman Akbari
16
Ini adalah pertanyaan yang paling banyak dipilih dan dilindungi yang jawabannya saya temukan paling membingungkan
Riyafa Abdul Hameed
6
@JaysonMinard setuju. Diminta untuk intervensi mod. Ini harus ditutup benar-benar. Saya awalnya berasumsi (salah) saya tidak bisa melakukannya sementara pertanyaan dilindungi, jadi saya tidak melindungi dan melakukan hal saya. Lindungi kembali sekarang untuk mencegah jawaban rep rendah dan sejenisnya, sambil menunggu mod.
Mena
4
"Pertanyaan ini tidak menunjukkan usaha penelitian" - Downvote button tooltip
Jean-François Corbett
6
Pertanyaan ini sedang dibahas di Meta .
Mark Amery

Jawaban:

754

The org.json perpustakaan mudah digunakan. Contoh kode di bawah ini:

import org.json.*;

String jsonString = ... ; //assign your JSON String here
JSONObject obj = new JSONObject(jsonString);
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");
    ......
}

Anda dapat menemukan lebih banyak contoh dari: Parse JSON di Jawa

Gelas yang dapat diunduh: http://mvnrepository.com/artifact/org.json/json

pengguna1931858
sumber
15
Saya setuju dengan @StaxMan. Saya baru saja mencoba org.json dan itu sangat merepotkan. Ini benar-benar tidak cocok dengan tipe Java Collection standar, misalnya.
Ken Williams
7
@StaxMan Saya akan memilih org.jsonlebih dari pustaka lain untuk parsing JSON sederhana tanpa melihat. Ini adalah pustaka referensi yang dibuat oleh Douglas Crockford (penemu JSON).
Omar Al-Ithawi
31
@OmarIthawi itu konyol. Ini adalah bukti konsep dengan API yang canggung, implementasi yang tidak efisien. Saya pikir lebih baik mempertimbangkan perpustakaan berdasarkan kemampuan mereka sendiri, daripada mencoba menyimpulkan kualitas dari visibilitas penulisnya - Doug telah mencapai banyak hal, tetapi itu tidak benar-benar mengubah kualitas lib tertentu. 10 tahun yang lalu itu adalah satu-satunya permainan di kota ini, tetapi sejak itu ada banyak kemajuan positif. Ini seperti Struts of json libs.
StaxMan
12
org.json adalah salah satu perpustakaan json terburuk. Orang harus melihat set fitur dan kinerja perpustakaan json yang tersedia sebelum memilih. Berikut adalah patokan yang saya lakukan membandingkan jackson, gson, org.json, genson menggunakan JMH: github.com/fabienrenaud/java-json-benchmark . jackson adalah pemenang yang jelas di sini.
fabien
4
Lisensi tidak termasuk lisensi Open Source yang umum digunakan, dan juga memegang hak cipta.
Christian Vielma
537

Demi contoh, mari kita asumsikan Anda memiliki kelas Personhanya dengan name.

private class Person {
    public String name;

    public Person(String name) {
        this.name = name;
    }
}

Google GSON ( Maven )

Favorit pribadi saya tentang serialisasi objek / de-serialisasi JSON yang hebat.

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"}

Memperbarui

Jika Anda ingin mengeluarkan satu atribut, Anda juga dapat melakukannya dengan mudah menggunakan Google library:

JsonObject jsonObject = new JsonParser().parse("{\"name\": \"John\"}").getAsJsonObject();

System.out.println(jsonObject.get("name").getAsString()); //John

Org.JSON ( Maven )

Jika Anda tidak memerlukan objek dererialisasi tetapi hanya untuk mendapatkan atribut, Anda dapat mencoba org.json ( atau lihat contoh GSON di atas! )

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
SDekov
sumber
16
Jawaban yang bagus. Satu saran untuk perbaikan kecil: GSON dan Jackson juga mendukung penggunaan representasi pohon JSON (untuk Jackson ini JsonNodes, GSON memiliki sesuatu yang serupa). Mungkin baik untuk menunjukkan cuplikan, karena itu mirip dengan satu-satunya cara yang ditawarkan org.json.
StaxMan
Dua perpustakaan lain yang layak disebut (untuk kepentingan kelengkapan): json-simple dan Oracle's JSONP
jake stayman
3
@NeonWarge, mengapa? Sepertinya saya bahwa jawaban ini mengasumsikan seseorang telah mendefinisikan kelas Java yang berisi bidang yang sama persis dengan string JSON, tidak kurang dan tidak lebih. Ini asumsi yang cukup kuat.
Andrea Lazzarotto
1
json-simple dan jsonp oracle melakukan sangat: github.com/fabienrenaud/java-json-benchmark Untuk kinerja, pilih jackson atau dsljson.
fabien
GSON tidak mendukung pemfilteran dinamis bidang pada level selain root!
Gangnus
102
  1. Jika seseorang ingin membuat objek Java dari JSON dan sebaliknya, gunakan guci pihak ketiga GSON atau JACKSON dll.

    //from object to JSON 
    Gson gson = new Gson();
    gson.toJson(yourObject);
    
    // from JSON to object 
    yourObject o = gson.fromJson(JSONString,yourObject.class);
  2. Tetapi jika seseorang hanya ingin mengurai string JSON dan mendapatkan beberapa nilai, (ATAU membuat string JSON dari awal untuk mengirim kawat) cukup gunakan jar JaveEE yang berisi JsonReader, JsonArray, JsonObject dll. Anda mungkin ingin mengunduh implementasi itu spek seperti javax.json. Dengan dua toples ini saya dapat mengurai json dan menggunakan nilai-nilai.

    API ini sebenarnya mengikuti model parsing 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");
tidak mencolok
sumber
4
@nondescript Jika saya harus menebak saya akan mengatakan itu dibatalkan karena tidak menjawab pertanyaan poster asli: "Apa kode yang diperlukan?" Jawaban yang diputuskan memberikan potongan kode.
jewbix.cube
4
Catatan: Jackson dan GSON keduanya mendukung gaya pohon dan / atau pengikatan Peta / Daftar, sehingga tidak perlu menggunakan paket Java EE (javax.json). javax.json tidak memiliki banyak hal selain Jackson atau GSON.
StaxMan
Saya sarankan menambahkan tautan ke perpustakaan JavaEE.
Basil Bourque
72

parser quick-json sangat mudah, fleksibel, sangat cepat dan dapat disesuaikan. Cobalah

Fitur:

  • Sesuai dengan spesifikasi JSON (RFC4627)
  • Parser JSON Berkinerja Tinggi
  • Mendukung pendekatan penguraian yang Fleksibel / Dapat Dikonfigurasi
  • Validasi yang dapat dikonfigurasi dari pasangan kunci / nilai dari hirarki JSON
  • Mudah digunakan # Footprint sangat kecil
  • Meningkatkan pengecualian yang ramah pengembang dan mudah dilacak
  • Dukungan Validasi Kustom Pluggable - Kunci / Nilai dapat divalidasi dengan mengkonfigurasi validator kustom saat dan ketika ditemui
  • Dukungan parser Validasi dan Non-Validasi
  • Dukungan untuk dua jenis konfigurasi (JSON / XML) untuk menggunakan parser validasi JSON cepat
  • Membutuhkan JDK 1.5
  • Tidak ada ketergantungan pada perpustakaan eksternal
  • Dukungan untuk Generasi JSON melalui serialisasi objek
  • Dukungan untuk pemilihan jenis koleksi selama proses parsing

Dapat digunakan seperti ini:

JsonParserFactory factory=JsonParserFactory.getInstance();
JSONParser parser=factory.newJsonParser();
Map jsonMap=parser.parseJson(jsonString);
rputta
sumber
3
Apakah ada javadoc yang tersedia?
jboi
24
Paket ini tidak dapat menangani nilai kosong saat parsing. Sebagai contoh: ... "description": "" ... throws Exception
Ivan
6
Saya telah memperbaiki masalah ini (dan banyak lainnya) di code.google.com/p/quick-json/issues/detail?id=11 Saya berharap penulis akan meluangkan waktu untuk memperbaikinya dalam rilis resmi.
noamik
8
Dari fitur-fitur yang terdaftar, tidak ada yang unik dibandingkan dengan opsi lain - dan klaim kinerja tinggi tidak didukung oleh apa pun; tidak seperti untuk perpustakaan yang lebih dewasa (Gson, Jackson, Genson, Boon) yang termasuk dalam tolok ukur seperti github.com/eishay/jvm-serializers , github.com/novoj/JavaJsonPerformanceTest atau developer.com/lang/jscript/… - I belum melihat perpustakaan ini termasuk dalam tes, atau menyebutkan itu banyak digunakan.
StaxMan
26
Proyek ini tampaknya sudah mati dan tampaknya tidak lagi di-host di repositori Maven pusat.
8bitjunkie
40

Anda dapat menggunakan Google Gson .

Menggunakan perpustakaan ini Anda hanya perlu membuat model dengan struktur JSON yang sama. Kemudian model secara otomatis diisi. Anda harus memanggil variabel Anda sebagai kunci JSON Anda, atau gunakan @SerializedNamejika Anda ingin menggunakan nama yang berbeda.

JSON

Dari contoh Anda:

{
    "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"
        }
    ]
}

Model

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

Parsing

Sekarang Anda dapat menguraikan menggunakan pustaka Gson:

MyModel model = gson.fromJson(jsonString, MyModel.class);

Impor gradle

Ingatlah untuk mengimpor perpustakaan di file Gradle aplikasi

implementation 'com.google.code.gson:gson:2.8.6' // or earlier versions

Pembuatan model otomatis

Anda dapat membuat model dari JSON secara otomatis menggunakan alat online seperti ini .

lubilis
sumber
38

Hampir semua jawaban yang diberikan memerlukan deserialisasi penuh JSON menjadi objek Java sebelum mengakses nilai di properti yang menarik. Alternatif lain, yang tidak menggunakan rute ini adalah menggunakan JsonPATH yang seperti XPath untuk JSON dan memungkinkan melintasi objek JSON.

Ini adalah spesifikasi dan orang-orang baik di JayWay telah membuat implementasi Java untuk spesifikasi yang dapat Anda temukan di sini: https://github.com/jayway/JsonPath

Jadi pada dasarnya untuk menggunakannya, tambahkan ke proyek Anda, misalnya:

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>${version}</version>
</dependency>

dan untuk menggunakan:

String pageName = JsonPath.read(yourJsonString, "$.pageInfo.pageName");
String pagePic = JsonPath.read(yourJsonString, "$.pageInfo.pagePic");
String post_id = JsonPath.read(yourJsonString, "$.pagePosts[0].post_id");

dll ...

Periksa halaman spesifikasi JsonPath untuk informasi lebih lanjut tentang cara-cara lain untuk melintang JSON.

Dade
sumber
Ini perpustakaan yang sangat bagus terutama untuk membaca dan memperbarui JSON tetapi waspadalah terhadap beberapa masalah yang diketahui tentang perpustakaan ini. Lihat [1]: github.com/json-path/JsonPath/issues/272 [2]: github.com/json-path/JsonPath/issues/375
papigee
38

A - Penjelasan

Anda bisa menggunakan perpustakaan Jackson , untuk mengikat JSON String ke instance POJO ( Plain Old Java Object ). POJO hanyalah sebuah kelas dengan hanya bidang pribadi dan metode pengambil / penyetel publik. Jackson akan melintasi metode (menggunakan refleksi ), dan memetakan objek JSON ke dalam contoh POJO karena nama bidang kelas cocok dengan nama bidang objek JSON.

Dalam objek JSON Anda, yang sebenarnya merupakan objek komposit , objek utama terdiri dari dua sub-objek. Jadi, kelas POJO kami harus memiliki hierarki yang sama. Saya akan memanggil seluruh Objek JSON sebagai objek Halaman . Objek halaman terdiri dari objek PageInfo , dan array objek Post .

Jadi kita harus membuat tiga kelas POJO berbeda;

  • Page Class, gabungan dari PageInfo Class dan array dari Instance Posting
  • PageInfo Kelas
  • Kelas Tulisan

Satu-satunya paket yang saya gunakan adalah Jackson ObjectMapper, yang kami lakukan adalah mengikat data;

com.fasterxml.jackson.databind.ObjectMapper

Ketergantungan yang diperlukan, file jar tercantum di bawah ini;

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

Ini kode yang diperlukan;

B - Kelas POJO Utama: Halaman

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 - Child POJO Class: 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 - Anak POJO Kelas: Posting

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 - Contoh File JSON: sampleJSONFile.json

Saya baru saja menyalin sampel JSON Anda ke file ini dan meletakkannya di bawah folder proyek.

{
   "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 - Kode Demo

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 - Output Demo

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
Levent Divilioglu
sumber
26

Gunakan minimal-json yang sangat cepat dan mudah digunakan. Anda dapat menguraikan dari String obj dan Stream.

Contoh data:

{
  "order": 4711,
  "items": [
    {
      "name": "NE555 Timer IC",
      "cat-id": "645723",
      "quantity": 10,
    },
    {
      "name": "LM358N OpAmp IC",
      "cat-id": "764525",
      "quantity": 2
    }
  ]
}

Parsing:

JsonObject object = Json.parse(input).asObject();
int orders = object.get("order").asInt();
JsonArray items = object.get("items").asArray();

Membuat 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>
Sakib Sami
sumber
Bagaimana penampilan pojo?
Jesse
Untuk Pojo gunakan gson. Perpustakaan ini tidak mendukung.
Sakib Sami
22

Saya percaya praktik terbaik harus melalui API Java JSON resmi yang masih dalam proses.

Giovanni Botta
sumber
7
Sejak saya menjawab, saya mulai menggunakan Jackson dan saya pikir itu adalah salah satu perpustakaan terbaik di luar sana untuk de-serialisasi JSON.
Giovanni Botta
2
Mengapa mereka menggunakan kembali JSONP untuk mengartikan sesuatu yang berbeda dari JSON dengan Padding ? ...
Chris Wesseling
@ChrisWesseling Apa maksudmu?
Giovanni Botta
"Java API for JSON Processing (JSON-P)" adalah judul dokumen yang Anda tautkan. Dan itu membingungkan saya, karena saya tahu JSONP berarti sesuatu yang lain.
Chris Wesseling
1
@ ChrisWesseling oh itu membingungkan. Itulah yang mereka pilih untuk spesifikasinya. Namun seperti yang saya katakan, saya akan langsung ke Jackson.
Giovanni Botta
22

Karena belum ada yang menyebutkannya, ini adalah awal dari solusi menggunakan Nashorn (JavaScript runtime bagian dari Java 8, tetapi sudah tidak digunakan lagi di Java 11).

Larutan

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

Perbandingan kinerja

Saya menulis konten JSON yang mengandung tiga array masing-masing 20, 20 dan 100 elemen. Saya hanya ingin mendapatkan 100 elemen dari array ketiga. Saya menggunakan fungsi JavaScript berikut untuk mem-parsing dan mendapatkan entri saya.

var fun = function(raw) {JSON.parse(raw).entries};

Menjalankan panggilan jutaan kali menggunakan Nashorn membutuhkan waktu 7,5 ~ 7,8 detik

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

org.json membutuhkan waktu 20 ~ 21 detik

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

Jackson membutuhkan waktu 6,5 ~ 7 detik

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

Dalam hal ini Jackson berkinerja lebih baik daripada Nashorn, yang berkinerja lebih baik daripada org.json. Nashorn API lebih sulit digunakan daripada org.json atau Jackson. Tergantung pada kebutuhan Anda, Jackson dan Nashorn keduanya bisa menjadi solusi yang layak.

otonglet
sumber
1
Apa unitnya " ""? Bukan inci? Apakah ini detik? Menit?
Peter Mortensen
1
@PeterMortensen artinya beberapa detik. Karena sepertinya tidak jelas saya akan mengubahnya. Terima kasih atas ulasannya.
otonglet
2
Sayangnya, Nashorn tidak digunakan lagi di Jawa 11. JEP 335 .
Per Mildner
1
Saya tahu Nashorn sudah usang, tetapi saya menyukai jawaban ini karena saya tidak ingin ada ketergantungan; namun, saya harus sedikit mengerjakan kembali contoh:ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); engine.eval("var fun = function(raw) { return JSON.parse(raw); };"); Map<String, Object> json = (Map<String, Object>) ((Invocable) engine).invokeFunction("fun", jsonString);
kgibm
21

Contoh di bawah ini menunjukkan cara membaca teks dalam pertanyaan, direpresentasikan sebagai variabel "jsonText". Solusi ini menggunakan Java EE7 javax.json API (yang disebutkan dalam beberapa jawaban lain). Alasan saya menambahkannya sebagai jawaban terpisah adalah bahwa kode berikut ini menunjukkan bagaimana sebenarnya mengakses beberapa nilai yang ditunjukkan dalam pertanyaan. Sebuah pelaksanaan javax.json API akan diperlukan untuk membuat kode ini dijalankan. Paket lengkap untuk masing-masing kelas yang diperlukan dimasukkan karena saya tidak ingin mendeklarasikan pernyataan "impor".

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");

Sekarang, sebelum siapa pun pergi dan turunkan jawaban ini karena tidak menggunakan GSON, org.json, Jackson, atau kerangka kerja pihak ketiga lainnya yang tersedia, ini merupakan contoh "kode wajib" per pertanyaan untuk menguraikan teks yang disediakan. Saya sangat menyadari bahwa kepatuhan terhadap standar JSR 353 saat ini tidak dipertimbangkan untuk JDK 9 dan karenanya spesifikasi JSR 353 harus diperlakukan sama dengan implementasi penanganan JSON pihak ketiga lainnya.

justin.hughey
sumber
15

Ini mengejutkan saya dengan betapa mudahnya itu. Anda bisa meneruskan Stringmemegang JSON Anda ke konstruktor JSONObject dalam paket org.json default.

JSONArray rootOfPage =  new JSONArray(JSONString);

Selesai Mikrofon tetes . Ini bekerja dengan JSONObjectsbaik. Setelah itu, Anda bisa melihat melalui hierarki Anda Objectsmenggunakan get()metode pada objek Anda.

brainmurphy1
sumber
13
The JSONArrayjenis bukan bagian dari API J2SE JDK dan Anda tidak mengatakan yang API atau perpustakaan pihak ketiga menyediakan jenis ini.
Bob
2
Bukannya saya akan merekomendasikan menggunakannya, tapi saya pikir ini merujuk pada paket "org.json" dari json.org/java . Dulu digunakan sebelum perpustakaan Java yang baik tersedia, tapi ini bertahun-tahun yang lalu (2008 atau sebelumnya)
StaxMan
1
Atau apakah brainmurphy1 berarti JSONArray di Android?
Alexander Farber
12

Ada banyak perpustakaan JSON yang tersedia di Jawa.

Yang paling terkenal adalah: Jackson, GSON, Genson, FastJson dan org.json.

Biasanya ada tiga hal yang harus diperhatikan untuk memilih perpustakaan apa pun:

  1. Performa
  2. Kemudahan penggunaan (kode mudah ditulis dan dapat dibaca) - yang sesuai dengan fitur.
  3. Untuk aplikasi seluler: ukuran ketergantungan / botol

Khusus untuk perpustakaan JSON (dan sembarang serialisasi / deserialisasi), penyatuan data juga biasanya menarik karena menghilangkan kebutuhan untuk menulis kode boiler-plate untuk mengemas / membongkar data.

Untuk 1, lihat patokan ini: https://github.com/fabienrenaud/java-json-benchmark Saya memang menggunakan JMH yang membandingkan (jackson, gson, genson, fastjson, org.json, jsonp) kinerja serializer dan deserializer menggunakan stream dan API databind. Untuk 2, Anda dapat menemukan banyak contoh di Internet. Tolok ukur di atas juga dapat digunakan sebagai sumber ...

Pengambilan cepat patokan: Jackson berkinerja 5 hingga 6 kali lebih baik daripada org.json dan lebih dari dua kali lebih baik daripada GSON.

Untuk contoh khusus Anda, kode berikut menerjemahkan json Anda dengan 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.
    }
}

Beri tahu saya jika Anda memiliki pertanyaan.

fabien
sumber
11

Selain jawaban lain, saya merekomendasikan jsonschema2pojo.org untuk layanan opensource online ini untuk menghasilkan kelas Java dari skema json atau json untuk GSON, Jackson 1.x atau Jackson 2.x. Misalnya, jika Anda memiliki:

{
   "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
         }
    ]
}

The jsonschema2pojo.org untuk GSON dihasilkan:

@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;
}
Viacheslav Vedenin
sumber
9

Jika Anda memiliki beberapa kelas Java (katakanlah Pesan) yang mewakili string JSON (jsonString), Anda dapat menggunakan perpustakaan Jackson JSON dengan:

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

dan dari objek pesan Anda dapat mengambil atributnya.

Shailendra Singh
sumber
9

Gson mudah dipelajari dan diimplementasikan, yang perlu kita ketahui adalah mengikuti dua metode

  • toJson () - Konversi objek Java ke format JSON

  • fromJson () - Mengubah JSON menjadi objek 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();
    }

    }
}

`

venkat
sumber
Untuk pengetahuan lengkap tentang Gson, rujuk tautan di bawah ini. github.com/google/gson/blob/master/UserGuide.md
venkat
9

Ada banyak perpustakaan open source yang hadir untuk mem-parsing konten JSON ke objek atau hanya untuk membaca nilai-nilai JSON. Persyaratan Anda hanya untuk membaca nilai dan menguraikannya ke objek kustom. Jadi perpustakaan org.json sudah cukup dalam kasus Anda.

Gunakan pustaka org.json untuk menguraikannya dan membuat JsonObject:

JSONObject jsonObj = new JSONObject(<jsonStr>);

Sekarang, gunakan objek ini untuk mendapatkan nilai Anda:

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

Anda dapat melihat contoh lengkap di sini:

Cara mengurai JSON di Jawa

lalitbhagtani
sumber
Sepertinya semua jawaban Anda berisi tautan ke situs itu. Jika itu spam, tolong hentikan. Jika tidak, maaf atas kebingungannya, tapi saya rasa tidak perlu mengirim tautan ke semua jawaban Anda.
Donald Duck
1
Sulit untuk memberikan jawaban, di mana Anda dapat menjelaskan semua skenario. Seperti dalam kasus ini, cara membaca json array atau beberapa objek json. Bahkan jika saya melakukannya, jawabannya akan sangat panjang dan orang mungkin bingung. Jadi saya memberikan tautan di mana penjelasan yang tepat diberikan, dengan contoh yang tepat. Dia bisa memilih berkunjung atau hanya bisa menggunakan penjelasan saya saja.
lalitbhagtani
1
Tampak bagi saya bahwa tautan yang Anda berikan hanya menunjukkan cara membaca JSON. Di mana saya dapat menemukan info tentang cara menggunakan JSON?
Lampros Tzanetos
Maaf, tapi saya tidak mengerti pertanyaan Anda: - "tentang bagaimana cara menggunakan JSON"
lalitbhagtani
7

Tolong lakukan sesuatu seperti ini:

JSONParser jsonParser = new JSONParser();
JSONObject obj = (JSONObject) jsonParser.parse(contentString);
String product = (String) jsonObject.get("productId");
Sreekanth
sumber
10
Eh, perpustakaan apa ini?
Stewart
2
Saya pikir dia menggunakan org.json.simple
Lasitha Yapa
7

Anda bisa menggunakan Pustaka Gson untuk mengurai string 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();

Anda juga dapat mengulang melalui array "posting" seperti:

JsonArray posts = jsonObject.getAsJsonArray("posts");
for (JsonElement post : posts) {
  String postId = post.getAsJsonObject().get("post_id").getAsString();
  //do something
}
LittleBigUllah
sumber
5
{
   "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
}
LReddy
sumber
9
Tolong jelaskan jawaban Anda karena jawaban hanya kode membantu orang lain jauh lebih sedikit daripada kode yang terdokumentasi dengan baik. Lihat "beri seorang pria ikan dan Anda memberinya makan selama sehari; ajari seorang pria untuk memancing dan Anda memberinya makan seumur hidup" .
Wai Ha Lee
Akan baik untuk menyebutkan ini untuk lib 'org.json'. Namun, saya tidak berpikir ini adalah cara yang baik untuk melakukannya karena sangat verbose, dan 'org.json' lib itu sendiri sudah usang (lambat, API rumit). Ada pilihan yang lebih baik: GSON, Jackson, Boon, Genson untuk digunakan.
StaxMan
5

Baca posting blog berikut, JSON di Jawa .

Posting ini agak lama, tetapi saya masih ingin menjawab pertanyaan Anda.

Langkah 1: Buat kelas POJO dari data Anda.

Langkah 2: Sekarang buat objek menggunakan JSON.

Employee employee = null;
ObjectMapper mapper = new ObjectMapper();
try{
    employee =  mapper.readValue(newFile("/home/sumit/employee.json"), Employee.class);
} 
catch (JsonGenerationException e){
    e.printStackTrace();
}

Untuk referensi lebih lanjut, Anda dapat merujuk ke tautan berikut .

sumit kumar
sumber
4

Jawaban teratas pada halaman ini menggunakan contoh yang terlalu sederhana seperti objek dengan satu properti (mis {{name: value}). Saya pikir itu masih sederhana tetapi contoh kehidupan nyata dapat membantu seseorang.

Jadi ini JSON yang dikembalikan oleh Google Translate API:

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

Saya ingin mengambil nilai atribut "translationText" misalnya "Arbeit" menggunakan Google Gson.

Dua kemungkinan pendekatan:

  1. Ambil hanya satu atribut yang diperlukan

    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. Buat objek Java dari 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;
yurin
sumber
4

Pertama, Anda perlu memilih perpustakaan implementasi untuk melakukannya.

The API Java untuk JSON Pengolahan (JSR 353) menyediakan API portabel untuk mengurai, menghasilkan, mengubah, dan permintaan JSON menggunakan model objek dan mengalir API.

The implementasi referensi di sini: https://jsonp.java.net/

Di sini Anda dapat menemukan daftar implementasi JSR 353:

Apa API yang mengimplementasikan JSR-353 (JSON)

Dan untuk membantu Anda memutuskan ... Saya menemukan artikel ini juga:

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/

Jika Anda menggunakan Jackson, berikut adalah artikel bagus tentang konversi antara JSON ke / dari Jawa menggunakan Jackson: https://www.mkyong.com/java/how-to-convert-java-object-to-from-json- jackson /

Semoga ini bisa membantu!

Jose Manuel Gomez Alvarez
sumber
Anda menunjuk ke versi 1 dari perpustakaan Jackson. Sangat menyarankan untuk menggunakan versi perpustakaan Jackson saat ini.
Herbert Yu
4

Anda dapat menggunakan Jayway JsonPath . Di bawah ini adalah tautan GitHub dengan kode sumber, detail pom, dan dokumentasi yang baik.

https://github.com/jayway/JsonPath

Ikuti langkah-langkah di bawah ini.

Langkah 1 : Tambahkan ketergantungan jalur JSON jayway di jalur kelas Anda menggunakan Maven atau unduh file JAR dan tambahkan secara manual.

<dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path</artifactId>
            <version>2.2.0</version>
</dependency>

Langkah 2 : Silakan simpan input JSON Anda sebagai file untuk contoh ini. Dalam kasus saya, saya menyimpan JSON Anda sebagai sampleJson.txt. Perhatikan bahwa Anda melewatkan koma antara pageInfo dan postingan.

Langkah 3 : Baca konten JSON dari file di atas menggunakan bufferedReader dan simpan sebagai 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();

Langkah 4 : Parsing string JSON Anda menggunakan parser JSON Jayway.

Object document = Configuration.defaultConfiguration().jsonProvider().parse(jsonInput);

Langkah 5 : Baca detailnya seperti di bawah ini.

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

Outputnya adalah :

$.pageInfo.pageName = abc
$.pageInfo.pagePic = http://example.com/content.jpg
$.posts[0].post_id  = 123456789012_123456789012
Ravi Durairaj
sumber
3

Saya punya JSON seperti ini:

{
   "pageInfo": {
         "pageName": "abc",
         "pagePic": "http://example.com/content.jpg"
    }
}

Kelas Java

class PageInfo {

    private String pageName;
    private String pagePic;

    // Getters and setters
}

Kode untuk mengubah JSON ini ke kelas Java.

    PageInfo pageInfo = JsonPath.parse(jsonString).read("$.pageInfo", PageInfo.class);

Maven

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.2.0</version>
</dependency>
Parth Solanki
sumber
2

Orang dapat menggunakan anotasi Apache @Model untuk membuat kelas model Java yang mewakili struktur file JSON dan menggunakannya untuk mengakses berbagai elemen di pohon JSON . Tidak seperti solusi lain yang satu ini bekerja sepenuhnya tanpa refleksi dan karenanya cocok untuk lingkungan di mana refleksi tidak mungkin atau datang dengan overhead yang signifikan.

Ada contoh proyek Maven yang menunjukkan penggunaannya. Pertama-tama ia mendefinisikan struktur:

@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 {
    }
}

dan kemudian menggunakan kelas RepositoryInfo dan Pemilik yang dihasilkan untuk mengurai aliran input yang disediakan dan mengambil informasi tertentu sambil melakukan itu:

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

Hanya itu saja! Selain itu di sini adalah inti langsung yang menunjukkan contoh serupa bersama-sama dengan komunikasi jaringan asinkron.

Jaroslav Tulach
sumber
2

jsoniter(jsoniterator) adalah perpustakaan json yang relatif baru dan sederhana, dirancang untuk menjadi sederhana dan cepat. Yang perlu Anda lakukan untuk menghapus data json adalah

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

di mana jsonDatastring data json.

Lihatlah situs web resmi untuk informasi lebih lanjut.

Pika sang Penyihir Paus
sumber
1

Kita bisa menggunakan kelas JSONObject untuk mengonversi string JSON ke objek JSON, dan untuk beralih ke objek JSON. Gunakan kode berikut.

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));
  }
}
pandai besi
sumber
2
Ini hanya android
Ľubomír
Ini bukan hanya android: docs.oracle.com/javaee/7/api/javax/json/JsonObject.html
Dermot Canniffe
1
@DermotCanniffe itu hanya Android.
user4020527
1

Anda dapat menggunakan parsing pustaka stream DSM untuk parsing json kompleks dan dokumen XML. DSM mem-parsing data hanya sekali dan tidak memuat semua data ke dalam memori.

Katakanlah kita memiliki kelas Page untuk menghapus data json yang diberikan.

Kelas halaman

public class Page {
    private String pageName;
    private String pageImage;
    private List<Sting> postIds;

    // getter/setter

}

Buat file Pemetaan yaml.

result:
  type: object     # result is array
  path: /posts
  fields:
    pageName:
        path: /pageInfo/pageName
    pageImage:
        path: /pageInfo/pagePic
    postIds:
      path: post_id
      type: array

Gunakan DSM untuk mengekstrak bidang.

DSM dsm=new DSMBuilder(new File("path-to-yaml-config.yaml")).create(Page.class);
Page page= (Page)dsm.toObject(new path-to-json-data.json");

variabel halaman diserialisasi ke json:

{
  "pageName" : "abc",
  "pageImage" : "http://example.com/content.jpg",
  "postIds" : [ "123456789012_123456789012" ]
}

DSM sangat baik untuk json dan xml yang kompleks.

mfe
sumber
0

Anda bisa menggunakan JsonNoderepresentasi pohon terstruktur dari string JSON Anda. Itu adalah bagian dari pustaka rock solid jackson yang ada di mana-mana.

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