แปลงสตริง JSON เป็นออบเจ็กต์ใน Java ME หรือไม่


116

มีวิธีใน Java / J2ME ในการแปลงสตริงหรือไม่เช่น:

{name:"MyNode", width:200, height:100}

ในการแสดงวัตถุภายในของเดียวกันในหนึ่งบรรทัดของรหัส?

เนื่องจากวิธีการปัจจุบันน่าเบื่อเกินไป:

Object n = create("new");
setString(p, "name", "MyNode");
setInteger(p, "width", 200);
setInteger(p, "height", 100);

อาจเป็นไลบรารี JSON?


6
สตริงของคุณไม่ใช่วัตถุ Json จริงๆดูมาตรฐาน Json ... มันเหมือนกับสัญกรณ์ JavaScript มากกว่า
PhiLho

19
@Jeremy Rudd: ควรจะ{"name":"MyNode", "width":200, "height":100}
Esteban Küber

1
@voyager: ฉันรู้ แต่ JavaScript รองรับชื่อคุณสมบัติโดยไม่มีเครื่องหมายคำพูด
TheFlash

1
@PhiLho: ฉันรู้ แต่ฉันเก็บไว้แบบนี้เพื่อความชัดเจน ปากกาเน้นข้อความ SO จะทำให้มันยุ่งเหยิง ชื่อและค่าเป็นสีแดง
TheFlash

มีวิธีทำการแปลงโดยใช้ API หลักของ Java หรือไม่? บางทีอาจเป็นใน Java 8? จาวา 9?
AlikElzin-kilaka

คำตอบ:


109

ฉันใช้สองสามตัวและสิ่งที่ฉันชอบคือ

http://code.google.com/p/json-simple/

ห้องสมุดมีขนาดเล็กมากจึงเหมาะสำหรับ J2ME

คุณสามารถแยกวิเคราะห์ JSON เป็นวัตถุ Java ในบรรทัดเดียวเช่นนี้

JSONObject json = (JSONObject)new JSONParser().parse("{\"name\":\"MyNode\", \"width\":200, \"height\":100}");
System.out.println("name=" + json.get("name"));
System.out.println("width=" + json.get("width"));

1
ฉันสามารถใช้ไลบรารีนี้ในแอพเพล็ตได้ไหม หากใช้การสะท้อนกลับฉันจะต้องเผชิญกับข้อผิดพลาดในการสะท้อนแสง มันจะทำงาน?
Mridang Agarwalla

jsonSimple ยังมีคลาส JSONParser อยู่หรือไม่ ฉันโทรหาชั้นไม่ได้
phuwin

JSONParser เลิกใช้งานแล้ว
Varda Elentári

79

ตัวเลือกที่ง่ายที่สุดคือJackson :

MyObject ob = new ObjectMapper().readValue(jsonString, MyObject.class);

มีไลบรารีอื่น ๆ ที่ใช้งานง่ายในทำนองเดียวกัน (กล่าวถึง Gson แล้ว); แต่ตัวเลือกบางอย่างก็ยุ่งยากกว่าเช่นไลบรารี org.json ดั้งเดิมซึ่งกำหนดให้คุณต้องสร้าง "JSONObject" ระดับกลางแม้ว่าคุณจะไม่มีความจำเป็นก็ตาม


Jackson ไม่รองรับ J2ME
skue

จริงถ้า j2me ยังคงอยู่ที่ระดับ JDK 1.4 โดยประมาณ (Jackson ต้องการ 1.5)
StaxMan

1
คุณมีเพียง 2 upticks แต่สมควรได้รับมากกว่านี้ แจ็คสันเป็นปลั๊กอินที่ง่ายมากสำหรับแอปของเรา ขอบคุณที่แนะนำ
Dan Doyon

1
แจ็คสันยังสามารถ deserialize วัตถุธรรมดา เช่น. Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye

ตัวอย่างโค้ดเพิ่มเติมโดยใช้ Jackson: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
cellepo

61

GSON เป็นตัวเลือกที่ดีในการแปลงวัตถุ java เป็นวัตถุ json และจับในทางกลับกัน
เป็นเครื่องมือที่จัดทำโดย Google

สำหรับการแปลง json เป็น java object use: fromJson(jsonObject,javaclassname.class)
สำหรับการแปลง java object เป็น json object use: toJson(javaObject)
และส่วนที่เหลือจะทำโดยอัตโนมัติ

สำหรับข้อมูลเพิ่มเติมและดาวน์โหลด


1
+1 ฉันกำลังมองหาสิ่งที่คล้ายกันและสิ่งนี้เหมาะกับใบเสร็จอย่างสมบูรณ์
Roy Tang

23

คุณสามารถทำได้ง่ายๆด้วย Google GSON

สมมติว่าคุณมีคลาสที่เรียกว่า User ที่มีผู้ใช้ฟิลด์ความกว้างและความสูงและคุณต้องการแปลงสตริง json ต่อไปนี้เป็นอ็อบเจ็กต์ User

{"name":"MyNode", "width":200, "height":100}

คุณสามารถทำได้อย่างง่ายดายโดยไม่ต้องแคสต์ (คำนึงถึงความคิดเห็นของ nimcap;)) ด้วยรหัสต่อไปนี้:

Gson gson = new Gson(); 
final User user = gson.fromJson(jsonString, User.class);

โดยที่ jsonString คือสตริง JSON ด้านบน

สำหรับข้อมูลเพิ่มเติมโปรดดูที่https://code.google.com/p/google-gson/


3
และใช่ฉันรู้ว่าคำถามถูกถามเมื่อ 4 ปีก่อน แต่คำตอบของฉันคือสำหรับผู้สนใจที่ต้องทำในปัจจุบัน :) หวังว่ามันจะช่วยใครบางคน!
sufinawaz

22

คุณมีตัวแยกวิเคราะห์ JSONจำนวนมากสำหรับ Java :

  • JSONObject.java
    A JSONObject คือคอลเล็กชันคู่ชื่อ / ค่าที่ไม่เรียงลำดับ รูปแบบภายนอกคือสตริงที่ห่อด้วยวงเล็บปีกกาที่มีเครื่องหมายโคลอนระหว่างชื่อและค่าและมีเครื่องหมายจุลภาคระหว่างค่าและชื่อ รูปแบบภายในคืออ็อบเจ็กต์ที่มีเมธอด get () และ opt () สำหรับการเข้าถึงค่าตามชื่อและเมธอด put () สำหรับการเพิ่มหรือแทนที่ค่าตามชื่อ ค่าสามารถเป็นประเภทใดก็ได้เหล่านี้: Boolean, JSONArray, JSONObject, Number และ String หรืออ็อบเจ็กต์ JSONObject.NULL

  • JSONArray.java
    A JSONArray คือลำดับของค่า รูปแบบภายนอกคือสตริงที่ห่อด้วยวงเล็บเหลี่ยมโดยมีลูกน้ำคั่นระหว่างค่า รูปแบบภายในคือออบเจ็กต์ที่มีเมธอด get () และ opt () สำหรับการเข้าถึงค่าโดยดัชนีและเมธอด put () สำหรับการเพิ่มหรือแทนที่ค่า ค่าสามารถเป็นประเภทใดก็ได้เหล่านี้: Boolean, JSONArray, JSONObject, Number และ String หรืออ็อบเจ็กต์ JSONObject.NULL

  • JSONStringer.java
    JSONStringer เป็นเครื่องมือสำหรับสร้างข้อความ JSON อย่างรวดเร็ว

  • JSONWriter.java
    JSONWriter เป็นเครื่องมือสำหรับการเขียนข้อความ JSON ไปยังสตรีมอย่างรวดเร็ว

  • JSONTokener.java
    JSONTokener รับสตริงต้นทางและแยกอักขระและโทเค็นออกจากสตริง ถูกใช้โดยตัวสร้าง JSONObject และ JSONArray เพื่อแยกวิเคราะห์สตริงซอร์ส JSON

  • JSONException.java
    JSONException ถูกส่งออกเมื่อตรวจพบข้อผิดพลาดทางไวยากรณ์หรือขั้นตอน

  • JSONString.java
    JSONString เป็นอินเทอร์เฟซที่อนุญาตให้คลาสใช้การทำให้เป็นอนุกรม JSON


1
ถ้า J2ME มี java.io.IOException; java.io.Writer; java.lang.reflect.Field; java.lang.reflect.Modifier; java.lang.reflect.Method; java.util.Collection; java.util.HashMap; java.util.Iterator; java.util.Map; java.util.TreeSet จากนั้นคุณสามารถใช้อันแรกได้เนื่องจากเป็นjavaคลาสง่ายๆ
Esteban Küber

2
ฉันคิดว่าไม่มีแพ็คเกจ java.lang.reflect ใน MIDP 2.0 จะทำให้ยากที่จะสร้างตัวแยกวิเคราะห์ทั่วไป ...
PhiLho

2
คนเก่งนักเดินทางคุณเพิ่งคัดลอกในเอกสารของคลาส Java JSON มาตรฐาน
TheFlash

@ Jeremy Rudd: แน่นอนฉันทำคุณคิดว่าฉันทำได้เร็วขนาดนี้ได้อย่างไร? ไม่ใช่ความพยายามที่จะหมุนรอบตัวคุณ แต่เป็นการปฏิบัติตามมาตรฐานของทั้งลิงค์และคัดลอก ฉันขอโทษถ้ามันออกมาอย่างนั้น
Esteban Küber

10
ฉันลดลงเพราะมันไม่ตอบคำถาม มันให้รายชื่อชั้นเรียนที่เกี่ยวข้อง แต่ไม่มีใครทำสำเร็จตามที่ผู้ถามต้องการ
Jeff Martin

7

เว็บไซต์ทางการของ JSONเป็นที่ที่คุณควรดู มันมีไลบรารีต่างๆที่สามารถใช้กับ Java ได้ฉันเคยใช้อันนี้เป็นการส่วนตัวJSON-libซึ่งเป็นการใช้งานในไซต์ดังนั้นจึงมีคลาสเดียวกัน - วิธีการอื่น ๆ ในหน้านี้

หากคุณคลิกลิงก์ html ที่นั่นคุณจะพบสิ่งที่คุณต้องการ

ในระยะสั้น:

ในการสร้างวัตถุ json และอาร์เรย์ json รหัสคือ:

JSONObject obj = new JSONObject();
obj.put("variable1", o1);
obj.put("variable2", o2);
JSONArray array = new JSONArray();
array.put(obj);

o1, o2 สามารถเป็นประเภทดั้งเดิม (long, int, boolean), Strings หรือ Arrays

กระบวนการย้อนกลับค่อนข้างง่ายฉันหมายถึงการแปลงสตริงเป็นวัตถุ / อาร์เรย์ json

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

ในการแยกวิเคราะห์อย่างถูกต้องคุณเพียงแค่ต้องรู้ว่าคุณกำลังแยกวิเคราะห์อาร์เรย์หรือวัตถุ



5

เช่นเดียวกับหลาย ๆ ที่ระบุไว้แล้ววิธีง่ายๆในการทำสิ่งนี้โดยใช้ JSON ง่ายๆดังต่อไปนี้

import org.json.JSONObject;

String someJsonString = "{name:"MyNode", width:200, height:100}";
JSONObject jsonObj = new JSONObject(someJsonString);

จากนั้นใช้ jsonObj เพื่อจัดการกับ JSON Object เช่น jsonObj.get ("ชื่อ");

ตามลิงค์ด้านล่าง JSON.simple แสดงประสิทธิภาพคงที่สำหรับไฟล์ JSON ทั้งขนาดเล็กและขนาดใหญ่

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/


คุณเขียนว่ามีหลายคนระบุคำแนะนำที่คุณโพสต์ไว้แล้ว อะไรคือสาระสำคัญของคำตอบของคุณ?
dakab

1
@dakab ขอบคุณสำหรับความคิดเห็นของคุณ สาระสำคัญของคำถามนี้คือการให้โค้ดหนึ่งบรรทัดซึ่งทำตามวัตถุประสงค์ และเนื่องจากมี apis มากมายให้ทำเช่นนี้ฉันจึงอยากให้ข้อมูลเพิ่มเติมเกี่ยวกับการเปรียบเทียบประสิทธิภาพของ apis ด้วย ดังนั้นสาระสำคัญของคำตอบนี้ที่ฉันหมายถึงคือการให้รหัส + ข้อมูลบางอย่างเกี่ยวกับการเปรียบเทียบประสิทธิภาพของ apis ต่างๆที่เพื่อนคนอื่น ๆ กล่าวถึงในหัวข้อนี้
Kripz


3

นี่เป็นคำถามเก่าและ json-simple ( https://code.google.com/p/json-simple/ ) อาจเป็นทางออกที่ดีในเวลานั้น แต่โปรดพิจารณาว่าโครงการนั้นดูเหมือนจะไม่ได้ใช้งานไปสักพัก!

ฉันขอแนะนำ Gson ซึ่งตอนนี้โฮสต์อยู่ที่: https://github.com/google/gson

หากประสิทธิภาพเป็นปัญหาของคุณคุณสามารถดูเกณฑ์มาตรฐานบางส่วนได้ที่http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ซึ่งเปรียบเทียบ


2

นอกเหนือจากwww.json.orgคุณยังสามารถใช้โปรแกรมแยกวิเคราะห์ของคุณเองโดยใช้javaccและจับคู่ไวยากรณ์ / สคีมาของคุณ ดูบันทึกนี้ในบล็อกของฉัน: http://plindenbaum.blogspot.com/2008/07/parsing-json-with-javacc-my-notebook.html


9
ว้าว. ฉันพนันได้เลยว่ามันง่ายและสนุก
TheFlash

6
เสียดายที่เราไม่มีป้าย "ตลก" และ "Insightful" ให้ :)
StaxMan

2

ฉันได้เขียนไลบรารีที่ใช้ json.org เพื่อแยกวิเคราะห์ JSON แต่จริงๆแล้วมันจะสร้างพร็อกซีของอินเทอร์เฟซสำหรับคุณ รหัส / JAR อยู่ใน code.google.com

http://fixjures.googlecode.com/

ฉันไม่รู้ว่ามันใช้ได้กับ J2ME หรือเปล่า เนื่องจากใช้ Java Reflection ในการสร้างพร็อกซีฉันคิดว่ามันจะใช้ไม่ได้ นอกจากนี้ยังมีการพึ่งพา Google Collections ซึ่งฉันต้องการนำออกอย่างหนักและอาจมีน้ำหนักมากเกินไปสำหรับความต้องการของคุณ แต่ช่วยให้คุณสามารถโต้ตอบกับข้อมูล JSON ของคุณในแบบที่คุณต้องการ:

interface Foo {
    String getName();
    int getWidth();
    int getHeight();
}

Foo myFoo = Fixjure.of(Foo.class).from(JSONSource.newJsonString("{ name : \"foo name\" }")).create();
String name = myFoo.getName(); // name now .equals("foo name");

น่าทึ่งแม้ว่าฉันไม่ต้องการ Foo เพียงแค่ Object ดั้งเดิม
TheFlash

2

เพียงสร้างวัตถุ Json ใน java ด้วย Json String ต่อไปนี้ในกรณีของคุณ

{name:"MyNode", width:200, height:100}

หากด้านบนเป็นสตริง Json ของคุณเพียงแค่สร้าง Json Object ขึ้นมา

JsonString ="{name:"MyNode", width:200, height:100}";
JSONObject yourJsonObject = new JSONObject(JsonString);
System.out.println("name=" + yourJsonObject.getString("name"));
System.out.println("width=" + yourJsonObject.getString("width"));

2

Jacksonสำหรับไฟล์ขนาดใหญ่GSONสำหรับไฟล์ขนาดเล็กและJSON ง่ายสำหรับการจัดการทั้งสองอย่าง


1
หลักฐานสำรองความคิดเห็นของ @ thanga จากที่นี่blog.takipi.com/…
Gob00st

ฉันเคยเห็นมาก่อนเช่นกัน แต่ก็ควรพิจารณาด้วยว่าไฟล์ขนาดเล็กนั้นสามารถแยกวิเคราะห์ได้อย่างรวดเร็ว ฉันจะคิดถึง JSON เท่านั้นง่าย ๆ ถ้าคุณมีไฟล์ขนาดเล็กจำนวนตันเพื่อแยกวิเคราะห์ว่าความแตกต่าง 30% หรือมากกว่านั้นมากกว่าแจ็คสันจะเพิ่มขึ้น นอกจากนี้โปรดดูความคิดเห็นยอดนิยมที่นั่นเกณฑ์มาตรฐานนั้นอาจไม่น่าเชื่อถือเกินไป จริงๆแล้วถ้าความเร็วเป็นสิ่งสำคัญสำหรับคุณคุณควรออกแบบเพื่อให้คุณสามารถฉีดโปรแกรมแยกวิเคราะห์เพื่อเปลี่ยนการใช้งานได้อย่างง่ายดายและทำการทดสอบเกณฑ์มาตรฐานของคุณเอง
ผู้ใช้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.