ฉันมีตัวแปร String ที่เรียกว่าjsonString
:
{"phonetype":"N95","cat":"WP"}
ตอนนี้ฉันต้องการแปลงเป็น JSON Object ฉันค้นหาเพิ่มเติมบน Google แต่ไม่ได้รับคำตอบที่คาดหวังไว้ ...
ฉันมีตัวแปร String ที่เรียกว่าjsonString
:
{"phonetype":"N95","cat":"WP"}
ตอนนี้ฉันต้องการแปลงเป็น JSON Object ฉันค้นหาเพิ่มเติมบน Google แต่ไม่ได้รับคำตอบที่คาดหวังไว้ ...
คำตอบ:
ใช้ห้องสมุด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();
สำหรับทุกคนที่ยังคงมองหาคำตอบ:
JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);
import org.json.simple.JSONObject
parser.parse(
และต้องการลองจับหรือโยน แต่เมื่อคุณเพิ่มอย่างใดอย่างหนึ่งมันจะให้Unhandled exception type ParseException
ข้อผิดพลาดหรือข้อผิดพลาด NoClassDefFound สำหรับ ParseException org.json.simple.parser
แม้ว่าคุณจะมี json-simple ใน Maven depedencies และมองเห็นได้ชัดเจนในไลบรารีของโครงการ
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"}
แหล่งข้อมูล:
มีหลาย serializers Java JSON และ deserializers เชื่อมโยงจากที่มีหน้าบ้าน JSON
ตามที่เขียนไว้นี้มี 22 เหล่านี้:
... แต่แน่นอนว่ารายการสามารถเปลี่ยนแปลงได้
โซลูชัน Java 7
import javax.json.*;
...
String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()
;
การแปลงString
เข้ามาJSONObject
คุณก็ต้องผ่านอินสแตนซ์เข้าไปสร้างของString
JSONObject
เช่น:
JSONObject jsonObj = new JSONObject("your string");
ฉันชอบใช้ 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
คุณต้องนำเข้า org.json
JSONObject jsonObj = null;
try {
jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
} catch (JSONException e) {
e.printStackTrace();
}
สตริงที่ 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();
หากคุณกำลังใช้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) และอื่น ๆ
ในการแปลงสตริงเป็น 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);
ใช้ JsonNode เร็วกว่า xml สำหรับการแยกวิเคราะห์ Json ทั่วไป มันสร้างแผนที่ภายในของค่าคีย์สำหรับอินพุตทั้งหมด
ตัวอย่าง:
private void test(@RequestBody JsonNode node)
สตริงอินพุต:
{"a":"b","c":"d"}
ไม่จำเป็นต้องใช้ไลบรารีภายนอก
คุณสามารถใช้คลาสนี้แทน :) (จัดการแม้กระทั่งรายการรายการซ้อนและ 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(
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:
JsonNode API - วิธีใช้นำทางแยกวิเคราะห์และประเมินค่าจากวัตถุ JsonNode
บทช่วยสอน - บทช่วยสอนวิธีใช้ Jackson เพื่อแปลงสตริง JSON เป็น JsonNode
โปรดทราบว่า 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
ใช้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"));
สำหรับการตั้งค่าวัตถุเดี่ยว 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
การแปลงสตริงเป็นวัตถุ 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;
}
Better Go ด้วยวิธีที่ง่ายกว่าโดยใช้org.json
lib เพียงทำตามวิธีง่ายๆดังต่อไปนี้:
JSONObject obj = new JSONObject();
obj.put("phonetype", "N95");
obj.put("cat", "WP");
ตอนนี้obj
เป็นJSONObject
รูปแบบการแปลงของคุณของสตริงที่เกี่ยวข้อง ในกรณีนี้ถ้าคุณมีคู่ค่าชื่อ
JSONObject
สำหรับสตริงคุณสามารถส่งโดยตรงไปยังตัวสร้างของ หากมันถูกต้องjson String
แล้วก็ไม่เป็นไรมันจะส่งข้อยกเว้น
user.put("email", "someemail@mail.com")
ก่อให้เกิดข้อยกเว้นที่ไม่สามารถจัดการได้
try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}