Перетворити рядок 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}
Естебан Кюбер

1
@voyager: Я знаю, але JavaScript споконвічно підтримує імена властивостей без лапок.
TheFlash

1
@PhiLho: Я це знаю, але я зберег це таким чином заради наочності. Маркер синтаксису SO заплутав би його. Назва і значення червоного кольору.
TheFlash

Чи є спосіб зробити перетворення за допомогою основних API Java? Можливо, у Java 8? Java 9?
АлікЕльзін-кілака

Відповіді:


108

Я використав декілька з них, і моя улюблена -

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
Чи можу я використовувати цю бібліотеку в аплеті. Якщо він використовує Reflection, то я зіткнуся з помилкою відбиття. Це би спрацювало?
Mridang Agarwalla

Чи є у jsonSimple ще клас JSONParser? Я не можу викликати клас.
phuwin

Тепер JSONParser застарілий.
Варда Елентарі

79

Найпростіший варіант - Джексон :

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

Є й інші подібні прості у використанні бібліотеки (про Гсона вже згадувалося); але деякі варіанти є більш трудомісткими, як оригінальна бібліотека org.json, яка вимагає створити проміжний "JSONObject", навіть якщо в них у вас немає потреби.


Джексон не підтримує J2ME
skue

Правда, якщо j2me все ще приблизно на рівні JDK 1.4 (Джексону потрібно 1,5)
StaxMan

1
У вас є лише 2 описи, але заслуговує на більше. Джексону було дуже просто підключити наш додаток. Дякуємо за рекомендацію.
Дан Дойон

1
Джексон також може десеріалізуватися до простого об'єкта. напр. Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye

Більше прикладів коду за допомогою Джексона: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
cellepo

61

GSON - хороший варіант для перетворення об’єкта java в об’єкт json і навпаки.
Це інструмент, який надає Google.

для перетворення json в використання об'єкта java: fromJson(jsonObject,javaclassname.class)
для перетворення об'єкта java в використання об'єкта json: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
    JSONObject - це не упорядкована колекція імен / значень пар. Його зовнішня форма являє собою рядок, загорнутий у фігурні дужки з двокрапками між іменами та значеннями, і коми між значеннями та іменами. Внутрішня форма - це об'єкт, що має методи get () та opt () для доступу до значень по імені та put () методів додавання або заміни значень на ім'я. Значення можуть бути будь-якого з цих типів: Boolean, JSONArray, JSONObject, Number та String або об'єкт JSONObject.NULL.

  • JSONArray.java
    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класи.
Естебан Кюбер

2
Я думаю, що в MIDP 2.0 немає пакету java.lang.reflect. Буде важко зробити загальний аналізатор ...
PhiLho

2
Розумний хлопець, voyager, ви щойно скопіювали в стандартну документацію класів Java JSON.
TheFlash

@ Джеремі Рудд: Звичайно, я це зробив, як ти думав, що я це зробив так швидко? Це не була спроба вас тролеїти, його стандартна практика як посилання, так і копіювання. Мені шкода, якщо вийшло саме так.
Естебан Кюбер

10
Я схвалив це, оскільки це не відповідає на питання. Це дає список пов’язаних класів, але жоден з них насправді не домагається того, що бажає.
Джефф Мартін

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 або масиви.

Зворотний процес досить простий, я маю на увазі перетворення рядка в об'єкт / масив json.

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

Щоб правильно проаналізувати, ви просто повинні знати, чи ви аналізуєте масив чи об’єкт.



5

Як і багато хто з них вже заявляв, досить простий спосіб зробити це за допомогою JSON.simple, як показано нижче

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/


Ви писали, що багато хто вже заявив про пропозицію, яку ви опублікували. У чому суть вашої відповіді?
дакаб

1
@dakab Дякуємо за ваші коментарі. Суть цього питання полягала в тому, щоб дати один рядок коду, який виконує мету. А оскільки для цього є багато apis, я просто хотів дати додаткову інформацію про порівняння ефективності apis. Отже, суть цієї відповіді, яку я мав на увазі, полягає в наданні коду + деякої інформації про порівняння ефективності різних апісів, згаданих іншими стипендіатами в цій темі.
Крипз


3

Це старе питання, і json-просто ( 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
Шкода, що у нас немає знаків "Смішні" та "Проникливі" :)
StaxMan

2

Я написав бібліотеку, яка використовує json.org для розбору JSON, але вона фактично створить проксі-інтерфейс для вас. Код / JAR розміщено на сайті code.google.com.

http://fixjures.googlecode.com/

Я не знаю, чи працює він на J2ME. Оскільки він використовує відображення Java для створення проксі, я думаю, що це не спрацює. Крім того, в даний час сильна залежність від колекцій Google, яку я хочу видалити, і, мабуть, занадто важка для ваших потреб, але це дозволяє взаємодіяти з вашими даними 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, а лише рідний Об'єкт.
TheFlash

2

Просто зробіть об’єкт Json в java за допомогою наступного рядка Json. У вашому випадку

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

якщо вище - ваш рядок Json, просто створіть за допомогою нього об’єкт Json.

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

Джексон для великих файлів, GSON для невеликих файлів та JSON.простий для обробки обох.


1
докази, щоб підкріпити коментар @ zahga звідси blog.takipi.com/…
Gob00st

Я це бачив і раніше, але також вважаю, що невеликі файли все одно швидко розбираються. Я б подумав про JSON.simple, якщо у вас є TON невеликих файлів для розбору, де ці 30% або більше різниці щодо Джексона збираються. Також дивіться головні коментарі там, що тест може бути не надто надійним. Дійсно, якщо для вас важлива швидкість, ви, ймовірно, повинні спроектувати, щоб ви могли ввести аналізатор, щоб легко змінити реалізацію, і зробити власні тести на еталони.
Користувач
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.