Cách chuyển đổi jsonString sang JSONObject trong Java


423

Tôi có biến String được gọi là jsonString:

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

Bây giờ tôi muốn chuyển đổi nó thành JSON Object. Tôi đã tìm kiếm thêm trên Google nhưng không nhận được câu trả lời mong đợi nào ...


1
Không có quyền của nó, vì tôi muốn tạo đối tượng json từ chuỗi json, câu trả lời được đưa ra bởi dogbane cho thấy đúng theo dõi để trả lời.
Ông Sajid Shaikh

Cả hai câu trả lời của Mappan và dogbane đều đúng nhưng họ đang sử dụng các mô-đun khác nhau. Bạn nên cẩn thận để nhập mô-đun chính xác cho từng mô-đun vì có nhiều mô-đun JSONObject.
Arashsoft

Tôi đã thử với thư viện GSON. Vui lòng kiểm tra liên kết này .
Thirumalvalavan

Đây là một đoạn video ngắn trình bày cách tạo JSONObject trong Java bằng org.json.
drorw

Câu trả lời:


677

Sử dụng thư viện org.json :

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

7
Tôi đã thử với JSONObject js = new JSONObject (jsonopes); nhưng nó cho thấy lỗi. trên jsonopes
Ông Sajid Shaikh

29
anh ta đã gặp lỗi vì anh ta không sử dụng org.json, anh ta đang sử dụng google-gson không hoạt động theo cách đó.
Gubatron

2
@Gubatron Cảm ơn anh bạn, tôi đã đúng, tôi vừa tải nó về và làm cho nó hoạt động tốt.
Ông Sajid Shaikh

3
@dogbane Nếu tôi không biết cấu trúc của chuỗi. Rõ ràng hơn, làm cách nào tôi có thể chuyển đổi một jsonString động được tạo thành jsonObject?
Saumyaraj

70
Sử dụng google-gson bạn có thể làm như thế này:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy

163

Cho bất cứ ai vẫn đang tìm kiếm một câu trả lời:

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

23
Và bạn có thể vui lòng đề cập đến gói nào để nhập cho cùng?
gonephishing

10
Điều này làm việc với tôi với:import org.json.simple.JSONObject
Mafro34 29/07/2015

1
Phiên bản 1.1.1 của json-Simple dường như có một số vấn đề. Ở trên cung cấp "Ngoại lệ chưa được xử lý" cho parser.parse(và muốn thử bắt hoặc ném. Nhưng khi bạn thêm một trong hai, nó sẽ Unhandled exception type ParseExceptionbáo lỗi hoặc lỗi NoClassDefFound cho ParseException org.json.simple.parserngay cả khi bạn có json-Simple trong các phần mềm Maven và hiển thị rõ ràng trong thư viện của dự án.
Juha Untinen 17/2/2016

2
org.json là một thư viện bằng chứng khái niệm. nó là một trong những điều tồi tệ nhất về hiệu suất và tính năng. Bạn nên nhìn vào bộ tính năng và hiệu suất của lib json trước khi chọn. Xem điểm chuẩn này tôi đã sử dụng JMH: github.com/fabienrenaud/java-json-benchmark Nó rõ ràng cho thấy jackson nhanh hơn bất cứ thứ gì khác và nhanh hơn 5 đến 6 lần so với org.json.
fabien

5
Trình phân tích cú pháp JSONParser = new JSONParser (); dường như bị
thất vọng

46

Bạn có thể sử dụng google-gson. Chi tiết:

Ví dụ đối tượng

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

(Tuần tự hóa)

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

Lưu ý rằng bạn không thể tuần tự hóa các đối tượng với các tham chiếu vòng vì điều đó sẽ dẫn đến đệ quy vô hạn.

(Giải trừ)

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

Một ví dụ khác cho Gson:

Gson rất dễ học và thực hiện, bạn cần biết là hai phương pháp sau:

-> toJson () - chuyển đổi đối tượng java sang định dạng JSON

-> fromJson () - chuyển đổi JSON thành đối tượng 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);
  }

}

Đầu ra

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

Tài nguyên:

Trang chủ dự án Google Gson

Hướng dẫn sử dụng Gson

Thí dụ


"Nếu bạn yêu cầu xử lý ở phía máy khách, nó phụ thuộc vào ngôn ngữ lập trình của bạn. Ví dụ với Java, bạn có thể sử dụng google-gson" Tôi nghĩ bạn có thể có nghĩa là "máy chủ" chứ không phải là "máy khách" ở đó. Và anh ấy đã gắn thẻ câu hỏi của mình "Java".
TJ Crowder

+1. Bây giờ tôi đã sử dụng Gson trong 4-5 dự án, trong các bối cảnh khá khác nhau, phía máy chủ và máy khách (cũng trong ứng dụng Android) và nó chưa bao giờ làm tôi thất bại. Rất đẹp và sạch lib.
Jonik

Nếu bạn muốn sử dụng gson nhưng không có lớp POJO được xác định trước (nghĩa là bạn có json chung không có cấu trúc được xác định trước), câu trả lời này có thể giúp - stackoverflow.com/questions/4110664/ Thẻ
Leandro David

40

Có nhiều trình tuần tự hóa và trình giải mã Java khác nhau được liên kết từ trang chủ JSON .

Theo văn bản này, có 22:

... nhưng tất nhiên danh sách có thể thay đổi.


24

Giải pháp Java 7

import javax.json.*;

...

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

;


5
Thư viện này có hiệu suất tồi tệ nhất của tất cả chúng. Xem điểm chuẩn này tôi đã làm với JMH: github.com/fabienrenaud/java-json-benchmark
fabien

15

Để chuyển đổi Stringthành JSONObjectbạn chỉ cần chuyển Stringthể hiện vào Con Contortor của JSONObject.

Ví dụ:

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

10

Tôi thích sử dụng google-gson cho việc này và chính xác là vì tôi không cần phải làm việc trực tiếp với JSONObject.

Trong trường hợp đó, tôi có một lớp sẽ tương ứng với các thuộc tính của Đối tượng JSON của bạn

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

Tuy nhiên, tôi nghĩ rằng câu hỏi của bạn giống như, Làm thế nào để tôi kết thúc với một đối tượng JSONObject thực tế từ Chuỗi JSON.

Tôi đã xem api google-json và không thể tìm thấy bất cứ thứ gì thẳng thắn như api của org.json, đây có lẽ là thứ bạn muốn sử dụng nếu bạn rất cần sử dụng JSONObject của barebones.

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

Với org.json.JSONObject (một API hoàn toàn khác) Nếu bạn muốn làm một cái gì đó như ...

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

Tôi nghĩ cái hay của google-gson là bạn không cần phải đối phó với JSONObject. Bạn chỉ cần lấy json, vượt qua lớp để muốn giải tuần tự hóa và các thuộc tính lớp của bạn sẽ được khớp với JSON, nhưng sau đó, mọi người đều có yêu cầu riêng của mình, có thể bạn không đủ khả năng để có các lớp được ánh xạ trước phía khử lưu huỳnh vì mọi thứ có thể quá năng động ở phía Tạo JSON. Trong trường hợp đó, chỉ cần sử dụng json.org.


8

bạn phải nhập org.json

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

8

Chuỗi JSON sử dụng Jacksonvới com.fasterxml.jackson.databind:

Giả sử chuỗi json của bạn đại diện như sau: 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

Nếu bạn đang sử dụng http://json-lib.sourceforge.net (net.sf.json.JSONObject)

nó khá dễ dàng:

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

hoặc là

JSONObject json = JSONSerializer.toJSON(myJsonString);

nhận các giá trị sau đó với json.getString (param), json.getInt (param), v.v.


JSONObject json = JSONSerializer.toJSON (myJsonString); sẽ tạo ra một erroe of Type không khớp với một tác phẩm khác
Henrique C.

3

Để chuyển đổi một chuỗi thành json và sting giống như json. {"âm vị": "N95", "mèo": "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 là gì? Có phải nó chỉ là một phần của Nhà cung cấp Danh bạ?
IgorGanapolsky

1
@IgorGanapolsky JSONParser là một tùy chọn được cung cấp bởi JSON đơn giản. Để làm điều này, bao gồm json-simple-1.1.1.jar
Aravind Cheekkallur

3

Sử dụng JsonNode của quickxml để phân tích cú pháp Json chung. Nó bên trong tạo ra một Bản đồ giá trị chính cho tất cả các đầu vào.

Thí dụ:

private void test(@RequestBody JsonNode node)

chuỗi đầu vào :

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

2

Không cần sử dụng bất kỳ thư viện bên ngoài.

Bạn có thể sử dụng lớp này thay thế :) (xử lý các danh sách chẵn, danh sách lồng nhau và 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;
    }
}

Để chuyển đổi chuỗi JSON của bạn thành hashmap, hãy sử dụng:

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

2

Codehaus Jackson - Tôi đã trở thành API tuyệt vời này từ năm 2012 cho các thử nghiệm dịch vụ web RESTful và JUnit của tôi. Với API của họ, bạn có thể:

(1) Chuyển đổi chuỗi JSON thành đậu Java

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

(2) Chuyển đổi chuỗi JSON thành đối tượng 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) Chuyển đổi Java bean thành Chuỗi 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. API JsonNode - Cách sử dụng, điều hướng, phân tích và đánh giá các giá trị từ một đối tượng JsonNode

  3. Hướng dẫn - Hướng dẫn đơn giản về cách sử dụng Jackson để chuyển đổi chuỗi JSON thành JsonNode


1

LƯU Ý rằng GSON với việc khử lưu lượng giao diện sẽ dẫn đến ngoại lệ như bên dưới.

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

Trong khi giải trừ; GSON không biết đối tượng nào phải được đặt trong giao diện đó.

Điều này được giải quyết bằng cách nào đó ở đây .

Tuy nhiên FlexJSON có giải pháp này vốn có. trong khi tuần tự hóa thời gian, nó sẽ thêm tên lớp như một phần của json như bên dưới.

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

Vì vậy, JSON sẽ là một số khó khăn; nhưng bạn không cần phải viết InstanceCreatortrong GSON.


1

Sử dụng org.json

Nếu bạn có Chuỗi chứa văn bản định dạng JSON, thì bạn có thể lấy Đối tượng JSON bằng các bước sau:

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

Bây giờ để truy cập phonetype

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

0

Để đặt json một đối tượng vào danh sách tức là

"locations":{

}

trong List<Location>

sử dụng

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

jackson.mapper-asl-1.9.7.jar


0

Chuyển đổi chuỗi thành đối tượng Json bằng cách sử dụng 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 với cách đơn giản hơn bằng cách sử dụng org.jsonlib. Chỉ cần làm một cách tiếp cận rất đơn giản như dưới đây:

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

Bây giờ objJSONObjectdạng chuyển đổi của Chuỗi tương ứng của bạn. Đây là trong trường hợp nếu bạn có cặp tên-giá trị.

Đối với một chuỗi, bạn có thể trực tiếp chuyển đến hàm tạo của JSONObject. Nếu nó là hợp lệ json String, thì không sao, nó sẽ ném ngoại lệ.


Nghĩa đen làm những gì bạn đã viết: user.put("email", "someemail@mail.com")gây ra một ngoại lệ chưa được xử lý.
Sebastialonso

1
@Sebastialonso Có, bạn cần phải bắt ngoại lệ. Như thế này:try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
TheLittleNaruto

@vidya Không, không phải vậy. Hãy xem xét so sánh nó một lần nữa.
TheLittleNaruto

@vidya Sure Dude
TheLittleNaruto
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.