472

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

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

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

|
737

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());
}
|
  • 1
    Tôi đã thử với như vậy JSONObject js = new JSONObject (jsonstring); nhưng nó hiển thị lỗi. trên jsonstring –  12:40:24 09/03/2011
  • 1
    anh ấy đã gặp lỗi vì anh ấy không sử dụng org.json, anh ấy đang sử dụng google-gson không hoạt động theo cách đó. –  13:20:11 09/03/2011
  • 1
    @Gubatron Cảm ơn bạn nói đúng, tôi vừa tải xuống và làm cho jar nên bây giờ nó hoạt động tốt. –  05:45:40 10/03/2011
  • 1
    @dogbane Điều gì xảy ra 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 để chuyển đổi jsonString được tạo động thành jsonObject? –  07:02:00 20/03/2014
  • 1
    Sử dụng google-gson, bạn có thể làm như thế này:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject(); –  18:38:35 13/05/2015
183

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

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);
|
  • 1
    Và bạn có thể vui lòng cho biết gói nhập khẩu nào cho giống nhau không? –  10:20:06 18/06/2015
  • 1
    Đây đang làm việc cho tôi với:import org.json.simple.JSONObject –  13:14:37 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ệ không đượ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ẽ xuất hiện Unhandled exception type ParseExceptionlỗi hoặc lỗi NoClassDefFound đối với ParseException org.json.simple.parserngay cả khi bạn có json-simple trong Maven depedencies và hiển thị rõ ràng trong thư viện của dự án. –  08:40:09 17/02/2016
  • 1
    org.json là một thư viện bằng chứng về 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. Người ta nên xem bộ tính năng và hiệu suất của json lib trước khi chọn. Xem điểm chuẩn này mà tôi đã thực hiện bằng cách sử dụng JMH: github.com/fabienrenaud/java-json-benchmark Nó cho thấy rõ ràng jackson nhanh hơn bất kỳ thứ gì khác và nhanh hơn 5 đến 6 lần so với org.json. –  20:47:22 27/06/2016
  • 1
    JSONParser parser = new JSONParser (); dường như depricated –  08:19:15 09/07/2018
50

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

Ví dụ về đối tượng

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

(Serialization)

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 tròn vì điều đó sẽ dẫn đến đệ quy vô hạn.

(Hủy đăng ký)

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à dễ thực hiện, bạn cần biết 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ụ

|
  • 1
    "Nếu bạn đang yêu cầu xử lý ở phía máy khách, điều đó 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ĩ có lẽ bạn muốn nói đến "máy chủ" hơn là "máy khách" ở đó. Và anh ấy đã gắn thẻ câu hỏi của mình là "Java". –  12:59:32 09/03/2011
  • 1
    +1. Tôi đã sử dụng Gson trong 4-5 dự án bây giờ, 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 sẽ. –  18:21:40 31/10/2013
  • 1
    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ó một json chung mà không có cấu trúc được xác định trước), câu trả lời này có thể hữu ích - stackoverflow.com/questions/4110664/… –  21:03:54 01/02/2018
43

Có nhiều trình tuần tự hóa Java JSON và trình giải mã đượ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.

|
25

Giải pháp Java 7

import javax.json.*;

...

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

;

|
19

Để chuyển đổi Stringthành JSONObjectbạn chỉ cần truyền Stringcá thể vào Constructor của JSONObject.

Ví dụ:

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

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();
|
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 sẽ có một lớp 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ĩ câu hỏi của bạn giống như, Làm cách nào để kết thúc với một đối tượng JSONObject thực tế từ Chuỗi JSON.

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

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 điều 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 xử lý JSONObject. Bạn chỉ cần lấy json, chuyển lớp mà bạn muốn deserialize vào và các thuộc tính lớp của bạn sẽ được khớp với JSON, nhưng một lần nữa, mọi người đều có yêu cầu riêng của họ, có thể bạn không đủ khả năng để có các lớp được ánh xạ trước trên phía deserializing 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();
        }
|
5

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

(1) Chuyển đổi chuỗi JSON sang Java bean

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. JsonNode API - Cách sử dụng, điều hướng, phân tích cú pháp 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 cách sử dụng Jackson để chuyển đổi chuỗi JSON thành JsonNode

|
4

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

Sử dụng JsonNode của fastxml cho Phân tích cú pháp Json Chung. Bên trong nó 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"}
|
3

Để chuyển đổi một chuỗi thành json và sting giống như 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);
|
  • 1
    JSONParser là gì? Nó chỉ là một phần của Trình cung cấp Danh bạ? –  22:09:31 01/11/2013
  • 1
    @IgorGanapolsky JSONParser là một tùy chọn buit được cung cấp bởi JSON đơn giản. Để làm điều này, bao gồm json-đơn giản-1.1.1.jar –  04:07:44 05/11/2013
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.

|
  • 1
    JSONObject json = JSONSerializer.toJSON (myJsonString); sẽ tạo ra một erroe Type mismatch thức hoạt động của người kia –  11:53:54 18/10/2013
2

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

Bạn có thể sử dụng lớp này để thay thế :) (xử lý 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 điều này:

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

Sử dụng org.json

Nếu bạn có một 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 loại điện thoại

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

LƯU Ý rằng GSON với việc giải kích thước một 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 deserialize; GSON không biết đối tượng nào phải được tạo ra cho giao diện đó.

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

Tuy nhiên FlexJSON đã có sẵn giải pháp này. trong khi tuần tự hóa thời gian nó đang 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ố; nhưng bạn không cần viết InstanceCreatorvốn được yêu cầu trong GSON.

|
0

Để thiết lập đối tượng đơn json 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

|
-1

Tốt hơn Go với cách đơn giản hơn bằng cách sử dụng org.jsonlib. Chỉ cần thực hiện một cách tiếp cận rất đơn giản như sau:

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

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

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

|
  • 1
    Thực hiện theo nghĩa đen những gì bạn đã viết: user.put("email", "someemail@mail.com")gây ra một ngoại lệ không được giải quyết. –  22:55:25 28/12/2015
  • 1
    @Sebastialonso Có, bạn cần nắm 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.} –  05:28:15 29/12/2015
  • 1
    @vidya Không, không phải đâu. Hãy xem xét so sánh nó một lần nữa. –  10:06:16 19/10/2017
  • 1
    @vidya chắc Dude –  10:44:23 19/10/2017

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.