Bagaimana cara mengubah jsonString ke JSONObject di Java

423

Saya memiliki variabel String yang disebut jsonString:

{"phonetype":"N95","cat":"WP"}

Sekarang saya ingin mengubahnya menjadi Object JSON. Saya mencari lebih banyak di Google tetapi tidak mendapatkan jawaban yang diharapkan ...

Tuan Sajid Shaikh
sumber
1
Tidak benar, karena saya ingin membuat objek json dari string json, jawaban yang diberikan oleh dogbane menunjukkan jalur yang benar untuk menjawab.
Tn. Sajid Shaikh
Kedua jawaban Mappan dan dogbane benar tetapi mereka menggunakan modul yang berbeda. Anda harus berhati-hati untuk mengimpor modul yang benar untuk masing-masing karena ada banyak modul JSONObject.
Arashsoft
Saya mencoba dengan perpustakaan GSON. Silakan periksa tautan ini .
Thirumalvalavan
Berikut adalah video pendek yang menunjukkan cara membuat JSONObject di Java menggunakan org.json.
drorw

Jawaban:

677

Menggunakan perpustakaan org.json :

try {
     JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
     Log.d("Error", err.toString());
}
dogbane
sumber
7
Saya mencoba dengan seperti itu JSONObject js = JSONObject baru (jsonstring); tetapi ini menunjukkan kesalahan. on jsonstring
Mr. Sajid Shaikh
29
dia mendapat kesalahan karena dia tidak menggunakan org.json, dia menggunakan google-gson yang tidak berfungsi seperti itu.
Gubatron
2
@ Gubatron Terima kasih Bung Anda benar saya baru saja mengunduhnya dan membuat jar jadi sekarang berfungsi dengan baik.
Tn. Sajid Shaikh
3
@dogbane Bagaimana jika saya tidak tahu struktur string. Lebih jelasnya, bagaimana saya bisa mengubah jsonString yang dihasilkan dinamis ke jsonObject?
Saumyaraj
70
Dengan menggunakan google-gson Anda dapat melakukannya seperti ini:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy
163

Kepada siapa pun yang masih mencari jawaban:

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);
Mappan
sumber
23
Dan bisakah Anda menyebutkan paket mana yang akan diimpor untuk hal yang sama?
gonephishing
10
Ini bekerja untuk saya dengan:import org.json.simple.JSONObject
Mafro34
1
Versi 1.1.1 dari json-simple tampaknya memiliki beberapa masalah. Di atas memberikan "Unhandled Exception" untuk parser.parse(dan menginginkan try-catch atau throws. Tetapi ketika Anda menambahkan salah satu, itu memberikan Unhandled exception type ParseExceptionkesalahan, atau kesalahan NoClassDefFound untuk ParseException org.json.simple.parserbahkan ketika Anda memiliki json-sederhana dalam depedensi Maven dan terlihat jelas di perpustakaan proyek.
Juha Untinen
2
org.json adalah perpustakaan bukti-konsep. ini adalah salah satu yang terburuk dalam hal kinerja dan fitur. Orang harus melihat set fitur dan kinerja json lib sebelum memilih. Lihat patokan ini yang saya lakukan menggunakan JMH: github.com/fabienrenaud/java-json-benchmark Jelas ini menunjukkan jackson lebih cepat dari yang lain dan 5 hingga 6 kali lebih cepat dari org.json.
fabien
5
Parser JSONParser = JSONParser baru (); tampaknya depriasi
Ouissal
46

Anda bisa menggunakannya google-gson. Detail:

Contoh Objek

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}

(Serialisasi)

BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj); 
==> json is {"value1":1,"value2":"abc"}

Perhatikan bahwa Anda tidak dapat membuat serial objek dengan referensi melingkar karena hal itu akan menghasilkan rekursi tak terbatas.

(Deserialisasi)

BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);  
==> obj2 is just like obj

Contoh lain untuk Gson:

Gson mudah dipelajari dan diimplementasikan, yang perlu Anda ketahui adalah dua metode berikut:

-> toJson () - mengonversi objek java ke format JSON

-> fromJson () - mengubah JSON menjadi objek java

import com.google.gson.Gson;

public class TestObjectToJson {
  private int data1 = 100;
  private String data2 = "hello";

  public static void main(String[] args) {
      TestObjectToJson obj = new TestObjectToJson();
      Gson gson = new Gson();

      //convert java object to JSON format
      String json = gson.toJson(obj);

      System.out.println(json);
  }

}

Keluaran

{"data1":100,"data2":"hello"}

Sumber:

Halaman Beranda Proyek Google Gson

Panduan Pengguna Gson

Contoh

kamaci
sumber
"Jika Anda meminta untuk memproses di sisi klien, itu tergantung pada bahasa pemrograman Anda. Misalnya dengan Java Anda dapat menggunakan google-gson" Saya pikir Anda mungkin berarti "server" daripada "klien" di sana. Dan dia menandai pertanyaannya "Java".
TJ Crowder
+1. Saya telah menggunakan Gson dalam proyek 4-5 sekarang, dalam konteks yang sangat berbeda, sisi server dan klien (juga di aplikasi Android), dan itu tidak pernah mengecewakan saya. Lib sangat bagus & bersih.
Jonik
Jika Anda ingin menggunakan gson tetapi tidak memiliki kelas POJO yang ditentukan sebelumnya (yaitu Anda memiliki json generik tanpa struktur yang ditentukan sebelumnya), jawaban ini dapat membantu - stackoverflow.com/questions/4110664/…
Leandro David
24

Solusi Java 7

import javax.json.*;

...

String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()

;

RSG
sumber
5
Perpustakaan ini memiliki kinerja terburuk dari semuanya. Lihat patokan ini yang saya lakukan dengan JMH: github.com/fabienrenaud/java-json-benchmark
fabien
15

Untuk mengkonversi Stringmenjadi JSONObjectAnda hanya perlu mengirimkan Stringinstance ke Konstruktor dari JSONObject.

Misalnya:

JSONObject jsonObj = new JSONObject("your string");
Charu
sumber
10

Saya suka menggunakan google-gson untuk ini, dan itu tepatnya karena saya tidak perlu bekerja dengan JSONObject secara langsung.

Dalam hal ini saya akan memiliki kelas yang akan sesuai dengan properti Obyek JSON Anda

class Phone {
 public String phonetype;
 public String cat;
}


...
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
Gson gson = new Gson();
Phone fooFromJson = gson.fromJson(jsonString, Phone.class);
...

Namun, saya pikir pertanyaan Anda lebih seperti, Bagaimana saya mengakhiri dengan objek JSONObject aktual dari String JSON.

Saya sedang melihat api google-json dan tidak dapat menemukan sesuatu yang lurus ke depan seperti api org.json yang mungkin apa yang ingin Anda gunakan jika Anda sangat membutuhkan menggunakan barebones JSONObject.

http://www.json.org/javadoc/org/json/JSONObject.html

Dengan org.json.JSONObject (API lain yang sama sekali berbeda) Jika Anda ingin melakukan sesuatu seperti ...

JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
System.out.println(jsonObject.getString("phonetype"));

Saya pikir keindahan google-gson adalah Anda tidak perlu berurusan dengan JSONObject. Anda hanya mengambil json, lulus kelas yang ingin deserialize ke, dan atribut kelas Anda akan dicocokkan dengan JSON, tetapi sekali lagi, semua orang memiliki persyaratan sendiri, mungkin Anda tidak mampu membayar mewah untuk memiliki kelas yang telah dipetakan pada sisi deserializing karena hal-hal mungkin terlalu dinamis di sisi Generasi JSON. Dalam hal itu gunakan saja json.org.

Gubatron
sumber
8

Anda harus mengimpor org.json

JSONObject jsonObj = null;
        try {
            jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
        } catch (JSONException e) {
            e.printStackTrace();
        }
Cabezas
sumber
8

String ke JSON menggunakan Jacksondengan com.fasterxml.jackson.databind:

Dengan asumsi json-string Anda mewakili sebagai ini: jsonString = {"phonetype": "N95", "cat": "WP"}

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * Simple code exmpl
 */
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonString);
String phoneType = node.get("phonetype").asText();
String cat = node.get("cat").asText();
Yugerten
sumber
3

Jika Anda menggunakan http://json-lib.sourceforge.net (net.sf.json.JSONObject)

itu sangat mudah:

String myJsonString;
JSONObject json = JSONObject.fromObject(myJsonString);

atau

JSONObject json = JSONSerializer.toJSON(myJsonString);

dapatkan nilai kemudian dengan json.getString (param), json.getInt (param) dan seterusnya.

Thero
sumber
JSONObject json = JSONSerializer.toJSON (myJsonString); akan menghasilkan erroe Ketidakcocokan Jenis karya yang lain
Henrique C.
3

Untuk mengkonversi string ke json dan sengatannya seperti json. {"phonetype": "N95", "cat": "WP"}

String Data=response.getEntity().getText().toString(); // reading the string value 
JSONObject json = (JSONObject) new JSONParser().parse(Data);
String x=(String) json.get("phonetype");
System.out.println("Check Data"+x);
String y=(String) json.get("cat");
System.out.println("Check Data"+y);
Aravind Cheekkallur
sumber
Apa itu JSONParser? Apakah ini hanya bagian dari Penyedia Kontak?
IgorGanapolsky
1
@IgorGanapolsky JSONParser adalah opsi buit in yang disediakan oleh JSON sederhana. Untuk melakukan ini, sertakan json-simple-1.1.1.jar
Aravind Cheekkallur
3

Gunakan JsonNode dari fastxml untuk Parsing Json Generik. Ini secara internal membuat Peta nilai kunci untuk semua input.

Contoh:

private void test(@RequestBody JsonNode node)

masukan String:

{"a":"b","c":"d"}
Wisnu
sumber
2

Tidak perlu menggunakan perpustakaan eksternal.

Anda dapat menggunakan kelas ini sebagai gantinya :) (menangani daftar genap, daftar bersarang, dan json)

public class Utility {

    public static Map<String, Object> jsonToMap(Object json) throws JSONException {

        if(json instanceof JSONObject)
            return _jsonToMap_((JSONObject)json) ;

        else if (json instanceof String)
        {
            JSONObject jsonObject = new JSONObject((String)json) ;
            return _jsonToMap_(jsonObject) ;
        }
        return null ;
    }


   private static Map<String, Object> _jsonToMap_(JSONObject json) throws JSONException {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != JSONObject.NULL) {
            retMap = toMap(json);
        }
        return retMap;
    }


    private static Map<String, Object> toMap(JSONObject object) throws JSONException {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keys();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            map.put(key, value);
        }
        return map;
    }


    public static List<Object> toList(JSONArray array) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.length(); i++) {
            Object value = array.get(i);
            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }
        return list;
    }
}

Untuk mengonversi string JSON Anda ke hashmap gunakan ini:

HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(
Natesh bhat
sumber
2

Codehaus Jackson - Saya telah menggunakan API yang luar biasa ini sejak 2012 untuk layanan web dan pengujian JUnit saya yang tenang. Dengan API mereka, Anda dapat:

(1) Konversi JSON String ke Java bean

public static String beanToJSONString(Object myJavaBean) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.writeValueAsString(myJavaBean);
}

(2) Mengubah String JSON menjadi objek JSON (JsonNode)

public static JsonNode stringToJSONObject(String jsonString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readTree(jsonString);
}

//Example:
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";   
JsonNode jsonNode = stringToJSONObject(jsonString);
Assert.assertEquals("Phonetype value not legit!", "N95", jsonNode.get("phonetype").getTextValue());
Assert.assertEquals("Cat value is tragic!", "WP", jsonNode.get("cat").getTextValue());

(3) Konversi kacang Jawa ke String JSON

    public static Object JSONStringToBean(Class myBeanClass, String JSONString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readValue(JSONString, beanClass);
}

REFS:

  1. Codehaus Jackson

  2. JsonNode API - Cara menggunakan, menavigasi, mengurai dan mengevaluasi nilai-nilai dari objek JsonNode

  3. Tutorial - Tutorial sederhana cara menggunakan Jackson untuk mengonversi string JSON ke JsonNode

Makan Siang Panini
sumber
1

Perhatikan bahwa GSON dengan deserializing antarmuka akan menghasilkan pengecualian seperti di bawah ini.

"java.lang.RuntimeException: Unable to invoke no-args constructor for interface XXX. Register an InstanceCreator with Gson for this type may fix this problem."

Sementara deserialize; GSON tidak tahu objek mana yang harus diintegrasikan untuk antarmuka itu.

Ini diselesaikan entah bagaimana di sini .

Namun FlexJSON memiliki solusi ini secara inheren. sementara cerita bersambung waktu itu menambahkan nama kelas sebagai bagian dari json seperti di bawah ini.

{
    "HTTPStatus": "OK",
    "class": "com.XXX.YYY.HTTPViewResponse",
    "code": null,
    "outputContext": {
        "class": "com.XXX.YYY.ZZZ.OutputSuccessContext",
        "eligible": true
    }
}

Jadi JSON akan menjadi beberapa; tetapi Anda tidak perlu menulis InstanceCreatoryang diperlukan di GSON.

Kanagavelu Sugumar
sumber
1

Menggunakan org.json

Jika Anda memiliki String yang berisi teks format JSON, maka Anda bisa mendapatkan Objek JSON dengan langkah-langkah berikut:

String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
JSONObject jsonObj = null;
    try {
        jsonObj = new JSONObject(jsonString);
    } catch (JSONException e) {
        e.printStackTrace();
    }

Sekarang untuk mengakses fonetype

Sysout.out.println(jsonObject.getString("phonetype"));
Azhar Zafar
sumber
0

Untuk mengatur objek json tunggal ke daftar yaitu

"locations":{

}

masuk ke List<Location>

menggunakan

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

jackson.mapper-asl-1.9.7.jar

pengguna3012570
sumber
0

Mengubah String ke Objek Json dengan menggunakan org.json.simple.JSONObject

private static JSONObject createJSONObject(String jsonString){
    JSONObject  jsonObject=new JSONObject();
    JSONParser jsonParser=new  JSONParser();
    if ((jsonString != null) && !(jsonString.isEmpty())) {
        try {
            jsonObject=(JSONObject) jsonParser.parse(jsonString);
        } catch (org.json.simple.parser.ParseException e) {
            e.printStackTrace();
        }
    }
    return jsonObject;
}
Anzar Ansari
sumber
-1

Better Go dengan cara yang lebih sederhana dengan menggunakan org.jsonlib. Lakukan saja pendekatan yang sangat sederhana seperti di bawah ini:

JSONObject obj = new JSONObject();
obj.put("phonetype", "N95");
obj.put("cat", "WP");

Sekarang objadalah JSONObjectbentuk Anda yang dikonversi dari String Anda masing-masing. Ini berlaku jika Anda memiliki pasangan nama-nilai.

Untuk string, Anda dapat langsung meneruskan ke konstruktor JSONObject. Jika itu akan menjadi valid json String, maka oke kalau tidak itu akan membuang pengecualian.

TheLittleNaruto
sumber
Secara harfiah melakukan apa yang Anda tulis: user.put("email", "[email protected]")memicu pengecualian yang tidak tertangani.
Sebastialonso
1
@Sebastialonso Ya, Anda perlu menangkap pengecualian. Seperti ini:try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
TheLittleNaruto
@vidya Tidak bukan. Pertimbangkan untuk membandingkannya lagi.
TheLittleNaruto
@vidya Sure Dude
TheLittleNaruto