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 ...
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 ...
Câu trả lời:
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());
}
JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
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);
import org.json.simple.JSONObject
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 ParseException
báo lỗi hoặc lỗi NoClassDefFound cho ParseException org.json.simple.parser
ngay 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.
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:
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:
- JSON-java .
- JSONUtil .
- jsonp .
- Json-lib .
- Chuỗi .
- SOJO .
- json-taglib .
- Linh hoạt .
- Argo .
- jsonij .
- fastjson .
- mjson .
- jjson .
- json-đơn giản .
- json-io .
- google-gson .
- FOSS Nova JSON .
- Ngô CHUYỂN ĐỔI .
- John johnzon .
- Genson .
- đầu bếp .
- progbase .
... nhưng tất nhiên danh sách có thể thay đổi.
Giải pháp Java 7
import javax.json.*;
...
String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()
;
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.
Chuỗi JSON sử dụng Jackson
vớ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();
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.
Để 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);
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(
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:
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
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
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 InstanceCreator
trong GSON.
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"));
Để đặ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
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;
}
Better Go với cách đơn giản hơn bằng cách sử dụng org.json
lib. 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ờ obj
là JSONObject
dạ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ệ.
user.put("email", "someemail@mail.com")
gây ra một ngoại lệ chưa được xử lý.
try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}