Chuyển đổi một chuỗi JSON thành đối tượng trong Java ME?


116

Có cách nào trong Java / J2ME để chuyển đổi một chuỗi, chẳng hạn như:

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

cho một biểu diễn Đối tượng nội bộ giống nhau, trong một dòng mã?

Bởi vì phương pháp hiện tại quá tẻ nhạt:

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

Có thể là một thư viện JSON?


6
Chuỗi của bạn không thực sự là một đối tượng Json, hãy xem tiêu chuẩn Json ... Nó giống như ký hiệu JavaScript hơn.
PhiLho 08/09/09

19
@Jeremy Rudd: Nên{"name":"MyNode", "width":200, "height":100}
Esteban Küber

1
@voyager: Tôi biết, nhưng JavaScript tự nhiên hỗ trợ tên thuộc tính không có dấu ngoặc kép.
TheFlash

1
@PhiLho: Tôi biết điều đó, nhưng tôi đã giữ nó theo cách này để rõ ràng. Công cụ đánh dấu cú pháp SO sẽ làm nó rối tung lên. Tên và giá trị màu đỏ.
TheFlash

Có cách nào để thực hiện chuyển đổi bằng cách sử dụng các API cốt lõi của Java không? Có lẽ trong Java 8? Java 9?
AlikElzin-kilaka

Câu trả lời:


108

Tôi đã sử dụng một vài trong số chúng và yêu thích của tôi là,

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

Thư viện rất nhỏ nên nó hoàn hảo cho J2ME.

Bạn có thể phân tích cú pháp JSON thành đối tượng Java trong một dòng như thế này,

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
Tôi có thể sử dụng thư viện này trong một applet không. Nếu nó sử dụng Reflection thì tôi sẽ phải đối mặt với lỗi phản xạ. Nó sẽ hoạt động?
Mridang Agarwalla

JsonSimple vẫn có lớp JSONParser? Tôi không thể gọi lớp.
phuwin

JSONParser hiện không được dùng nữa.
Varda Elentári

79

Lựa chọn đơn giản nhất là Jackson :

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

Có những thư viện đơn giản tương tự khác để sử dụng (Gson đã được đề cập); nhưng một số lựa chọn tốn nhiều công sức hơn, chẳng hạn như thư viện org.json ban đầu, yêu cầu bạn tạo "JSONObject" trung gian ngay cả khi bạn không có nhu cầu.


Jackson không hỗ trợ J2ME
skue

Đúng vậy, nếu j2me vẫn là khoảng ở mức JDK 1.4 (Jackson đòi hỏi 1.5)
StaxMan

1
Bạn chỉ có 2 gậy nhưng xứng đáng hơn. Jackson thực sự dễ dàng plugin vào ứng dụng của chúng tôi. Cảm ơn vì đã giới thiệu.
Dan Doyon

1
Jackson cũng có thể deserialize với một vật thể đơn giản. ví dụ. Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye,

Các ví dụ mã khác bằng cách sử dụng Jackson: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
cellepo

61

GSON là một lựa chọn tốt để chuyển đổi đối tượng java sang đối tượng json và ngược lại.
Nó là một công cụ được cung cấp bởi google.

để chuyển đổi json sang sử dụng đối tượng java: fromJson(jsonObject,javaclassname.class)
để chuyển đổi đối tượng java sang sử dụng đối tượng json: toJson(javaObject)
và phần còn lại sẽ được thực hiện tự động

Để biết thêm thông tin và tải xuống


1
+1 Tôi đang tìm kiếm thứ gì đó tương tự và điều này hoàn toàn phù hợp với hóa đơn!
Roy Tang

23

Bạn có thể làm điều này dễ dàng với Google GSON.

Giả sử bạn có một lớp được gọi là Người dùng với các trường là người dùng, chiều rộng và chiều cao và bạn muốn chuyển đổi chuỗi json sau thành đối tượng Người dùng.

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

Bạn có thể dễ dàng làm như vậy mà không cần phải truyền (hãy ghi nhớ nhận xét của nimcap;)), với đoạn mã sau:

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

Trong đó jsonString là Chuỗi JSON ở trên.

Để biết thêm thông tin, vui lòng xem https://code.google.com/p/google-gson/


3
Và vâng, tôi nhận ra câu hỏi đã được hỏi cách đây 4 năm, nhưng câu trả lời của tôi là dành cho các bên quan tâm cần làm điều này ở hiện tại :) Hy vọng nó sẽ giúp được ai đó!
sufinawaz

22

Bạn có nhiều trình phân tích cú pháp JSON cho Java :

  • JSONObject.java
    JSONObject là một tập hợp các cặp tên / giá trị không có thứ tự. Hình thức bên ngoài của nó là một chuỗi được bao bọc trong dấu ngoặc nhọn với dấu hai chấm giữa tên và giá trị, dấu phẩy giữa giá trị và tên. Biểu mẫu bên trong là một đối tượng có các phương thức get () và opt () để truy cập các giá trị theo tên và các phương thức put () để thêm hoặc thay thế các giá trị theo tên. Các giá trị có thể là bất kỳ loại nào sau đây: Boolean, JSONArray, JSONObject, Number và String hoặc đối tượng JSONObject.NULL.

  • JSONArray.java
    JSONArray là một chuỗi giá trị có thứ tự. Hình thức bên ngoài của nó là một chuỗi được bao bọc trong dấu ngoặc vuông với dấu phẩy giữa các giá trị. Biểu mẫu bên trong là một đối tượng có các phương thức get () và opt () để truy cập các giá trị theo chỉ mục và các phương thức put () để thêm hoặc thay thế các giá trị. Các giá trị có thể là bất kỳ loại nào sau đây: Boolean, JSONArray, JSONObject, Number và String hoặc đối tượng JSONObject.NULL.

  • JSONStringer.java
    JSONStringer là một công cụ để tạo nhanh chóng văn bản JSON.

  • JSONWriter.java
    JSONWriter là một công cụ để viết nhanh văn bản JSON vào các luồng.

  • JSONTokener.java
    Một JSONTokener lấy một chuỗi nguồn và trích xuất các ký tự và mã thông báo từ nó. Nó được sử dụng bởi các hàm tạo JSONObject và JSONArray để phân tích cú pháp các chuỗi nguồn JSON.

  • JSONException.java
    Một JSONException được ném ra khi một lỗi cú pháp hoặc thủ tục được phát hiện.

  • JSONString.java
    JSONString là một giao diện cho phép các lớp thực hiện tuần tự hóa JSON của chúng.


1
Nếu J2ME có 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 ;, thì bạn có thể sử dụng cái đầu tiên, vì chúng là javacác lớp đơn giản .
Esteban Küber

2
Tôi nghĩ rằng không có gói java.lang.reflect trong MIDP 2.0. Sẽ làm cho khó khăn để thực hiện một phân tích cú pháp chung ...
PhiLho

2
Chàng trai thông minh, người đi du lịch, bạn vừa sao chép trong tài liệu của các lớp Java JSON tiêu chuẩn.
TheFlash

@Jeremy Rudd: tất nhiên là tôi đã làm, làm thế nào bạn nghĩ rằng tôi đã làm điều đó quá nhanh? Nó không phải là một nỗ lực để troll bạn, thực hành tiêu chuẩn của nó cho cả liên kết và sao chép. Tôi xin lỗi nếu nó xảy ra theo cách đó.
Esteban Küber

10
Tôi đã phản đối điều này vì nó không trả lời câu hỏi. Nó đưa ra một danh sách các lớp liên quan nhưng không có lớp nào trong số chúng thực sự đạt được những gì người hỏi muốn.
Jeff Martin

7

Trang web chính thức của JSON là nơi bạn nên xem. Nó cung cấp nhiều thư viện khác nhau có thể được sử dụng với Java, cá nhân tôi đã sử dụng cái này, JSON-lib là một triển khai của công việc trong trang web, vì vậy nó có cùng một lớp - phương thức, v.v. trong trang này .

Nếu bạn nhấp vào các liên kết html ở đó, bạn có thể tìm thấy bất cứ thứ gì bạn muốn.

Nói ngắn gọn:

để tạo một đối tượng json và một mảng json, mã là:

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

o1, o2, có thể là các kiểu nguyên thủy (long, int, boolean), Chuỗi hoặc Mảng.

Quá trình ngược lại khá đơn giản, ý tôi là chuyển đổi một chuỗi thành đối tượng / mảng json.

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

Để được phân tích cú pháp chính xác, bạn chỉ cần biết liệu bạn đang phân tích cú pháp một mảng hay một đối tượng.



5

Giống như nhiều điều đã nêu, Một cách khá đơn giản để thực hiện việc này bằng cách sử dụng JSON.simple như bên dưới

import org.json.JSONObject;

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

Và sau đó sử dụng jsonObj để xử lý JSON Object. ví dụ: jsonObj.get ("tên");

Theo liên kết bên dưới, JSON.simple đang hiển thị hiệu quả không đổi cho cả tệp JSON nhỏ và lớn

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


Bạn đã viết rằng nhiều người đã nêu đề xuất mà bạn đã đăng. Bản chất của câu trả lời của bạn là gì?
dakab

1
@dakab Cảm ơn ý kiến ​​của bạn. Bản chất của câu hỏi này là đưa ra một dòng mã thực hiện mục đích. Và vì có rất nhiều apis có sẵn để làm điều này, tôi chỉ muốn cung cấp thêm một số thông tin về việc so sánh hiệu quả của apis. Vì vậy, bản chất của câu trả lời này mà tôi muốn nói là cung cấp mã + một số thông tin về việc so sánh hiệu quả của các apis khác nhau được các nghiên cứu sinh khác đề cập trong chủ đề này.
Kripz


3

Đây là một câu hỏi cũ và json-simple ( https://code.google.com/p/json-simple/ ) có thể là một giải pháp tốt tại thời điểm đó, nhưng hãy lưu ý rằng dự án đó có vẻ như không hoạt động trong một thời gian!

Tôi đề xuất Gson hiện được lưu trữ tại: https://github.com/google/gson

Nếu hiệu suất là vấn đề của bạn, bạn có thể xem một số điểm chuẩn http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ để so sánh.


2

Ngoài www.json.org, bạn cũng có thể triển khai trình phân tích cú pháp của riêng mình bằng javacc và khớp với ngữ pháp / lược đồ cá nhân của bạn. Xem ghi chú này trên blog của tôi: http://plindenbaum.blogspot.com/2008/07/parsing-json-with-javacc-my-notebook.html


9
Chà. Tôi cá rằng điều đó thật dễ dàng và thú vị.
TheFlash

6
Quá xấu chúng ta không có "Funny" và "sâu sắc" phù hiệu để cung cấp cho :)
StaxMan

2

Tôi đã viết một thư viện sử dụng json.org để phân tích cú pháp JSON, nhưng nó thực sự sẽ tạo proxy của một giao diện cho bạn. Mã / JAR có trên code.google.com.

http://fixjures.googlecode.com/

Tôi không biết nếu nó hoạt động trên J2ME. Vì nó sử dụng Java Reflection để tạo proxy, tôi nghĩ nó sẽ không hoạt động. Ngoài ra, nó hiện có sự phụ thuộc khó khăn vào Bộ sưu tập của Google mà tôi muốn xóa và nó có thể quá nặng so với nhu cầu của bạn, nhưng nó cho phép bạn tương tác với dữ liệu JSON của mình theo cách bạn đang tìm kiếm:

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

Thật tuyệt vời, mặc dù tôi không muốn Foo, chỉ là Object gốc.
TheFlash

2

Chỉ cần tạo một đối tượng Json trong java với chuỗi Json sau đây.

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

nếu ở trên là chuỗi Json của bạn, chỉ cần tạo một Đối tượng Json với nó.

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 cho các tệp lớn, GSON cho các tệp nhỏ và JSON.simple để xử lý cả hai.


1
bằng chứng để sao lưu bình luận của @ thanga từ đây blog.takipi.com/…
Gob00st

Tôi cũng đã thấy điều đó trước đây, nhưng cũng nên cân nhắc rằng dù sao thì các tệp nhỏ cũng có thể phân tích cú pháp nhanh. Tôi sẽ chỉ nghĩ về JSON.simple nếu bạn có TẤN tệp nhỏ để phân tích cú pháp trong đó mức chênh lệch 30% hoặc hơn so với Jackson sẽ tăng lên. Cũng xem các bình luận hàng đầu ở đó, điểm chuẩn đó có thể không quá đáng tin cậy. Thực sự, nếu tốc độ là quan trọng đối với bạn, có lẽ bạn nên thiết kế để bạn có thể đưa vào trình phân tích cú pháp để thay đổi triển khai một cách dễ dàng và thực hiện các bài kiểm tra điểm chuẩn của riêng bạn.
Người dùng
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.