วิธีการแปลง jsonString เป็น JSONObject ใน Java


423

ฉันมีตัวแปร String ที่เรียกว่าjsonString:

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

ตอนนี้ฉันต้องการแปลงเป็น JSON Object ฉันค้นหาเพิ่มเติมบน Google แต่ไม่ได้รับคำตอบที่คาดหวังไว้ ...


1
ไม่ถูกต้องเพราะฉันต้องการสร้างวัตถุ json จากสตริง json คำตอบที่ได้รับจาก dogbane แสดงเส้นทางที่ถูกต้องในการตอบ
Mr. Sajid Shaikh

ทั้งคำตอบของ Mappan และ dogbane นั้นถูกต้อง แต่พวกเขากำลังใช้โมดูลที่แตกต่างกัน คุณควรระมัดระวังในการนำเข้าโมดูลที่ถูกต้องสำหรับแต่ละโมดูลเนื่องจากมีโมดูล JSONObject จำนวนมาก
Arashsoft

ฉันลองกับห้องสมุด GSON กรุณาตรวจสอบลิงค์นี้
Thirumalvalavan

ต่อไปนี้เป็นวิดีโอสั้น ๆ ที่แสดงวิธีสร้าง JSONObject ใน Java โดยใช้ org.json
drorw

คำตอบ:


677

ใช้ห้องสมุดorg.json :

try {
     JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
     Log.d("Error", err.toString());
}

7
ฉันลองด้วยเช่น JSONObject js = new JSONObject (jsonstring); แต่มันแสดงข้อผิดพลาด ใน jsonstring
Mr. Sajid Shaikh

29
เขาได้รับข้อผิดพลาดเพราะเขาไม่ได้ใช้ org.json เขาใช้ google-gson ซึ่งไม่ได้ผล
Gubatron

2
@Gatatron ขอบคุณเพื่อนคุณถูกต้องฉันเพิ่งดาวน์โหลดมาแล้วทำไหดังนั้นตอนนี้มันทำงานได้ดี
Mr. Sajid Shaikh

3
@dogbane เกิดอะไรขึ้นถ้าฉันไม่รู้โครงสร้างของสตริง ชัดเจนยิ่งขึ้นฉันจะแปลง jsonString ที่สร้างแบบไดนามิกเป็น jsonObject ได้อย่างไร
Saumyaraj

70
ใช้ google-gson คุณสามารถทำสิ่งนี้ได้:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy

163

สำหรับทุกคนที่ยังคงมองหาคำตอบ:

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);

23
และคุณช่วยกรุณาพูดถึงแพ็คเกจที่จะนำเข้าเหมือนกันได้ไหม
แล้ว

10
สิ่งนี้ใช้ได้กับฉันด้วย:import org.json.simple.JSONObject
Mafro34

1
json-simple เวอร์ชัน 1.1.1 ดูเหมือนว่าจะมีปัญหาบางอย่าง ข้างต้นให้ "ข้อยกเว้น Unhandled" สำหรับparser.parse(และต้องการลองจับหรือโยน แต่เมื่อคุณเพิ่มอย่างใดอย่างหนึ่งมันจะให้Unhandled exception type ParseExceptionข้อผิดพลาดหรือข้อผิดพลาด NoClassDefFound สำหรับ ParseException org.json.simple.parserแม้ว่าคุณจะมี json-simple ใน Maven depedencies และมองเห็นได้ชัดเจนในไลบรารีของโครงการ
Juha Untinen

2
org.json เป็นห้องสมุดพิสูจน์แนวคิด มันเป็นหนึ่งในสิ่งที่แย่ที่สุดในแง่ของประสิทธิภาพและคุณสมบัติ หนึ่งควรดูที่ชุดคุณสมบัติและประสิทธิภาพการทำงานของ json lib ก่อนที่จะเลือก ดูเกณฑ์มาตรฐานนี้ที่ฉันใช้กับ JMH: github.com/fabienrenaud/java-json-benchmarkมันแสดงให้เห็นชัดเจนว่าแจ็คสันเร็วกว่าสิ่งอื่นและเร็วกว่า org.json 5 ถึง 6 เท่า
fabien

5
JSONParser parser = ใหม่ JSONParser (); ดูเหมือนจะไม่ถูกต้อง
Ouissal

46

google-gsonคุณสามารถใช้ รายละเอียด:

ตัวอย่างวัตถุ

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

(อันดับ)

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

โปรดทราบว่าคุณไม่สามารถทำให้เป็นอันดับวัตถุด้วยการอ้างอิงแบบวงกลมเนื่องจากจะส่งผลให้เกิดการเรียกซ้ำแบบไม่สิ้นสุด

(ซีเรียลไลซ์)

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

อีกตัวอย่างหนึ่งสำหรับ Gson:

Gson นั้นง่ายต่อการเรียนรู้และนำไปใช้คุณจำเป็นต้องรู้ว่ามีสองวิธีต่อไปนี้:

-> toJson () - แปลงวัตถุ Java เป็นรูปแบบ JSON

-> fromJson () - แปลง JSON เป็นวัตถุ 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);
  }

}

เอาท์พุต

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

แหล่งข้อมูล:

หน้าแรกของโครงการ Google Gson

คู่มือผู้ใช้ Gson

ตัวอย่าง


"หากคุณกำลังขอให้ดำเนินการที่ฝั่งไคลเอ็นต์ขึ้นอยู่กับภาษาการเขียนโปรแกรมของคุณตัวอย่างเช่นด้วย Java คุณสามารถใช้ google-gson"ฉันคิดว่าคุณอาจหมายถึง "เซิร์ฟเวอร์" แทนที่จะเป็น "ไคลเอนต์" ที่นั่น และเขาก็แท็กคำถามของเขา "Java"
TJ Crowder

+1 ตอนนี้ฉันใช้ Gson ในโครงการ 4-5 โครงการในบริบทที่แตกต่างกันมากเซิร์ฟเวอร์และฝั่งไคลเอ็นต์ (เช่นในแอป Android) และมันก็ไม่เคยล้มเหลวเลย lib & สะอาดดีมาก
Jonik

หากคุณต้องการใช้ gson แต่ไม่มีคลาส POJO ที่กำหนดไว้ล่วงหน้า (เช่นคุณมี json ทั่วไปที่ไม่มีโครงสร้างที่กำหนดไว้ล่วงหน้า) คำตอบนี้อาจช่วยได้ - stackoverflow.com/questions/4110664/ …
Leandro David

40

มีหลาย serializers Java JSON และ deserializers เชื่อมโยงจากที่มีหน้าบ้าน JSON

ตามที่เขียนไว้นี้มี 22 เหล่านี้:

... แต่แน่นอนว่ารายการสามารถเปลี่ยนแปลงได้


24

โซลูชัน Java 7

import javax.json.*;

...

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

;


5
ห้องสมุดนี้มีประสิทธิภาพที่เลวร้ายที่สุดของพวกเขาทั้งหมด ดูมาตรฐานนี้ที่ฉันทำกับ JMH: github.com/fabienrenaud/java-json-benchmark
fabien

15

การแปลงStringเข้ามาJSONObjectคุณก็ต้องผ่านอินสแตนซ์เข้าไปสร้างของStringJSONObject

เช่น:

JSONObject jsonObj = new JSONObject("your string");

10

ฉันชอบใช้ google-gson ในเรื่องนี้และมันแม่นยำเพราะฉันไม่จำเป็นต้องทำงานกับ JSONObject โดยตรง

ในกรณีนี้ฉันมีคลาสที่สอดคล้องกับคุณสมบัติของ JSON Object ของคุณ

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

อย่างไรก็ตามฉันคิดว่าคำถามของคุณเป็นอย่างไรฉันจะลงเอยด้วยวัตถุ JSONObject จริงจากสตริง JSON ได้อย่างไร

ฉันกำลังดู google-json api และไม่สามารถหาสิ่งใด ๆ ได้ตรงไปข้างหน้าเหมือนกับ api ของ org.json ซึ่งอาจเป็นสิ่งที่คุณต้องการใช้หากคุณต้องการใช้ JSONObject แบบเปล่า ๆ

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

ด้วย org.json.JSONObject (API อื่นที่แตกต่างอย่างสิ้นเชิง) หากคุณต้องการทำอะไรเช่น ...

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

ฉันคิดว่าความงามของ google-gson คือคุณไม่จำเป็นต้องจัดการกับ JSONObject คุณเพิ่งคว้า json ผ่านชั้นเรียนเพื่อต้องการลดระดับและคุณลักษณะคลาสของคุณจะถูกจับคู่กับ JSON แต่จากนั้นอีกครั้งทุกคนมีความต้องการของตัวเองบางทีคุณอาจไม่สามารถซื้อฟุ่มเฟือยได้ ด้าน deserializing เนื่องจากสิ่งต่าง ๆ อาจมีไดนามิกเกินไปในด้านการสร้าง JSON ในกรณีนี้ให้ใช้ json.org


8

คุณต้องนำเข้า org.json

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

8

สตริงที่ JSONใช้Jacksonกับcom.fasterxml.jackson.databind:

สมมติว่า json-string ของคุณแสดงถึงสิ่งนี้: 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();

3

หากคุณกำลังใช้http://json-lib.sourceforge.net (net.sf.json.JSONObject)

มันค่อนข้างง่าย:

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

หรือ

JSONObject json = JSONSerializer.toJSON(myJsonString);

รับค่าจากนั้นด้วย json.getString (param), json.getInt (param) และอื่น ๆ


JSONObject json = JSONSerializer.toJSON (myJsonString); จะผลิตเอโรโร่ของประเภทไม่ตรงกันอีกงานหนึ่ง
Henrique C.

3

ในการแปลงสตริงเป็น json และ sting นั้นเป็น json { "PHONETYPE": "N95", "แมว": "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);

JSONParser คืออะไร มันเป็นเพียงส่วนหนึ่งของผู้ให้บริการติดต่อ?
IgorGanapolsky

1
@IgorGanapolsky JSONParser เป็นตัวเลือก buit ที่จัดทำโดย JSON แบบง่าย ในการทำเช่นนี้ให้รวม json-simple-1.1.1.jar
Aravind Cheekkallur

3

ใช้ JsonNode เร็วกว่า xml สำหรับการแยกวิเคราะห์ Json ทั่วไป มันสร้างแผนที่ภายในของค่าคีย์สำหรับอินพุตทั้งหมด

ตัวอย่าง:

private void test(@RequestBody JsonNode node)

สตริงอินพุต:

{"a":"b","c":"d"}

2

ไม่จำเป็นต้องใช้ไลบรารีภายนอก

คุณสามารถใช้คลาสนี้แทน :) (จัดการแม้กระทั่งรายการรายการซ้อนและ 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;
    }
}

ในการแปลงสตริง JSON เป็น hashmap ให้ใช้สิ่งนี้:

HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(

2

Codehaus Jackson - ฉันได้รับ API ที่ยอดเยี่ยมนี้มาตั้งแต่ปี 2012 สำหรับการทดสอบเว็บเซิร์ฟเวอร์ RESTful และการทดสอบ JUnit ของฉัน ด้วย API ของพวกเขาคุณสามารถ:

(1) แปลงสตริง JSON เป็น Java bean

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

(2) แปลงสตริง JSON เป็นวัตถุ 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) แปลง Java bean เป็น JSON String

    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 - วิธีใช้นำทางแยกวิเคราะห์และประเมินค่าจากวัตถุ JsonNode

  3. บทช่วยสอน - บทช่วยสอนวิธีใช้ Jackson เพื่อแปลงสตริง JSON เป็น JsonNode


1

โปรดทราบว่า GSON ที่มีการยกเลิกการซีเรียลอินเทอร์เฟซจะส่งผลให้มีข้อยกเว้นเช่นด้านล่าง

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

ในขณะที่ดีซีเรียลไลซ์ GSON ไม่ทราบว่าต้องใช้วัตถุใดในการอินเทอร์เฟซนั้น

นี้ได้รับการแก้ไขอย่างใดที่นี่

อย่างไรก็ตามFlexJSONมีวิธีแก้ปัญหานี้โดยเนื้อแท้ ในขณะที่เวลาเป็นอนุกรมมันคือการเพิ่มชื่อคลาสเป็นส่วนหนึ่งของ json เช่นด้านล่าง

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

ดังนั้น JSON จะมีบางคนตะคอก แต่คุณไม่จำเป็นต้องเขียนInstanceCreatorสิ่งที่จำเป็นใน GSON


1

ใช้org.json

หากคุณมีสตริงที่มีข้อความรูปแบบ JSON คุณสามารถรับวัตถุ JSON ได้โดยทำตามขั้นตอนต่อไปนี้:

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

ตอนนี้เพื่อเข้าถึง phonetype

Sysout.out.println(jsonObject.getString("phonetype"));

0

สำหรับการตั้งค่าวัตถุเดี่ยว json ในรายการคือ

"locations":{

}

ในการ List<Location>

ใช้

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

jackson.mapper-ASL-1.9.7.jar


0

การแปลงสตริงเป็นวัตถุ Json โดยใช้ 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;
}

-1

Better Go ด้วยวิธีที่ง่ายกว่าโดยใช้org.jsonlib เพียงทำตามวิธีง่ายๆดังต่อไปนี้:

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

ตอนนี้objเป็นJSONObjectรูปแบบการแปลงของคุณของสตริงที่เกี่ยวข้อง ในกรณีนี้ถ้าคุณมีคู่ค่าชื่อ

JSONObjectสำหรับสตริงคุณสามารถส่งโดยตรงไปยังตัวสร้างของ หากมันถูกต้องjson Stringแล้วก็ไม่เป็นไรมันจะส่งข้อยกเว้น


ทำสิ่งที่คุณเขียนอย่างแท้จริง: user.put("email", "someemail@mail.com")ก่อให้เกิดข้อยกเว้นที่ไม่สามารถจัดการได้
Sebastialonso

1
@Sebastialon ใช่คุณจำเป็นต้องรับการยกเว้น เช่นนี้:try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
TheLittleNaruto

@ vidya ไม่ไม่ ลองเปรียบเทียบอีกครั้ง
TheLittleNaruto

@vidya Sure Dude
TheLittleNaruto
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.