Преобразовать строку 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?
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
Могу ли я использовать эту библиотеку в апплете. Если он использует Reflection, я столкнусь с ошибкой Reflectionpermission. Это сработает?
Мриданг Агарвалла

Есть ли у jsonSimple класс JSONParser? Я не могу позвонить в класс.
Phuwin 05

JSONParser устарел.
Varda Elentári

79

Самый простой вариант - Джексон :

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

Есть и другие, не менее простые в использовании библиотеки (Gson уже упоминался); но некоторые варианты более трудоемки, например оригинальная библиотека 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 Я искал что-то подобное, и это полностью отвечает всем требованиям!
Рой Тан,

23

Вы можете легко сделать это с помощью Google GSON.

Допустим, у вас есть класс с именем User с полями user, width и height, и вы хотите преобразовать следующую строку 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 07

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классы.
Эстебан Кюбер, 08

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

2
Умный парень, путешественник, вы только что скопировали в стандартную документацию классов 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), String или Arrays.

Обратный процесс довольно прост, я имею в виду преобразование строки в объект / массив 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. например, jsonObj.get ("имя");

Согласно приведенной ниже ссылке, JSON.simple показывает постоянную эффективность как для маленьких, так и для больших файлов JSON.

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


Вы написали, что многие уже высказали ваше предложение. В чем суть вашего ответа?
dakab

1
@dakab Спасибо за ваши комментарии. Суть этого вопроса заключалась в том, чтобы дать одну строку кода, которая выполняет свою цель. И поскольку для этого доступно множество API, я просто хотел дать дополнительную информацию о сравнении эффективности API. Итак, суть этого ответа, который я имел в виду, заключалась в том, чтобы дать код + некоторую информацию о сравнении эффективности различных API, упомянутых другими участниками в этом потоке.
Kripz 02 нояб.15,


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
Жаль, что у нас нет значков «Веселые» и «Проницательные» :)
StaxMan

2

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

http://fixjures.googlecode.com/

Не знаю, работает ли это на J2ME. Поскольку он использует Java Reflection для создания прокси, я думаю, что это не сработает. Кроме того, в настоящее время он сильно зависит от коллекций 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, только собственный Object.
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

Jackson для больших файлов, GSON для маленьких файлов и JSON.simple для обработки обоих.


1
доказательства, подтверждающие комментарий @ thanga отсюда blog.takipi.com/…
Gob00st

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