JSON (JavaScript Object Notation) - текстовый формат обмена данными, легко читаемый людьми и основанный на синтаксисе Javascript. JSON, как правило, используется с Javascript, если быть более точным - при обмене данными между Javascript и сервером. Стоит отметить, что JSON обладает существенным преимуществом перед XML - он менее избыточен.
Пример JSON объекта:
Как видно, все предельно просто. Фактически, JSON объект является валидным Javascript кодом, то есть может быть исполнен интерпретатором Javascript. Но как сгенерировать JSON на сервере, и как распарсить пришедший от клиента JSON?
PHP программисты сейчас довольно ухмыльнутся, ведь у них есть стандартные функции json_encode и json_decode, позволяющие легко и просто гонять PHP сущности в JSON и обратно.
Java программистам приходится сложнее - надо поддерживать свою крутость (где PHP - Personal HomePage language, и где крутая Enterprise Java), поэтому с JSON приходится работать путем сторонних библиотек, коих на офсайте json.org приводится немало. Программисты Python здесь тоже ухмыльнутся - их дзен "Должен быть только один, и лучше всего очевидный, способ сделать это".
Итак, в данной статье рассматривается использование отличной java библиотеки для генерирования и парсинга JSON - json-simple, официальный сайт на google code. Кстати, там можно найти немало отличных примеров!
Вот таблица сопоставления типов JSON и Java:
Тааак, и как нам всем этим добром пользоваться?
Cоздадим JSON строку!
Ну ладно, круто. А что-то посложнее?
Думаю, комментарии здесь излишни, все действительно чрезвычайно интуитивно и просто. Другие примеры генерирования JSON можно посмотреть на офсайте.
А вот с парсингом дела обстоят намного хуже. Шутка:)
Вот такая отличная библиотека. Приятной работы!
Пример JSON объекта:
{
userId: 32,
firstName: "Алексей",
lastName: "Голобурдин",
address: {
country: "Россия",
city: "Москва"
},
phone: "8 (905) 777 77 77"
}
Как видно, все предельно просто. Фактически, JSON объект является валидным Javascript кодом, то есть может быть исполнен интерпретатором Javascript. Но как сгенерировать JSON на сервере, и как распарсить пришедший от клиента JSON?
PHP программисты сейчас довольно ухмыльнутся, ведь у них есть стандартные функции json_encode и json_decode, позволяющие легко и просто гонять PHP сущности в JSON и обратно.
Java программистам приходится сложнее - надо поддерживать свою крутость (где PHP - Personal HomePage language, и где крутая Enterprise Java), поэтому с JSON приходится работать путем сторонних библиотек, коих на офсайте json.org приводится немало. Программисты Python здесь тоже ухмыльнутся - их дзен "Должен быть только один, и лучше всего очевидный, способ сделать это".
Итак, в данной статье рассматривается использование отличной java библиотеки для генерирования и парсинга JSON - json-simple, официальный сайт на google code. Кстати, там можно найти немало отличных примеров!
Вот таблица сопоставления типов JSON и Java:
JSON | Java |
string | java.lang.String |
number | java.lang.Number |
true | false | java.lang.Number |
null | null |
array | java.util.List |
object | java.util.Map |
Тааак, и как нам всем этим добром пользоваться?
Примеры давай, примеры!
Cоздадим JSON строку!
//import org.json.simple.JSONObject;
JSONObject resultJson = new JSONObject();
resultJson.put("name","foo");
resultJson.put("num",new Integer(100));
resultJson.put("is_vip",new Boolean(true));
resultJson.put("nickname",null);
System.out.print(obj.toString());
// {"name": "foo", "num": 100, "is_vip": true, "nickname: null}
Ну ладно, круто. А что-то посложнее?
JSONArray ar = new JSONArray();
JSONObject obj = new JSONObject();
JSONObject resultJson = new JSONObject();
ar.add("first");
ar.add(new Integer(100));
obj.put("one", "two");
obj.put("three", "four");
resultJson.put("paramsArray", ar);
resultJson.put("paramsObj", obj);
resultJson.put("paramsStr", "some string");
System.out.print(obj.toString());
// {"paramsArray": ["first", 100],
// "paramsObj": {"one": "two", "three": "four"},
// "paramsStr": "some string"}
Думаю, комментарии здесь излишни, все действительно чрезвычайно интуитивно и просто. Другие примеры генерирования JSON можно посмотреть на офсайте.
Парсинг JSON
А вот с парсингом дела обстоят намного хуже. Шутка:)
String json = "{paramsArray: [\"first\", 100],"
+ "paramsObj: {one: \"two\", three: \"four\"},"
+ "paramsStr: \"some string\"}";
JSONParser parser = new JSONParser();
Object obj = parser.parse(json);
JSONObject jsonObj = (JSONObject) obj;
System.out.println(jsonObj.get("paramsStr"));
// some string
JsonObject jo = jsonObj.get("paramsObj");
System.out.println(jo.get("three"));
// four
JsonArray ja = jsonObj.get("paramsArray");
System.out.println(ja.get(1));
// 100
Вот такая отличная библиотека. Приятной работы!
Этот комментарий был удален автором.
ОтветитьУдалитьЗдравствуйте!
ОтветитьУдалитьСпасибо за статью, всё просто и понятно!
Вот только ошибка возникает при запуске:
No source code is available for type org.json.simple.JSONObject; did you forget to inherit a required module?
Скажите, пожалуйста, чем она может быть обусловлена?
(org.json.simple.JSONObject; импортирован, путь к .jar архиву прописан в classpath)
Здравствуйте!
ОтветитьУдалитьСпасибо за комментарий.
Я сейчас работаю в JDeveloper от Oracle, там свой процесс подключения jar'ников к проекту. IDE сама где-то прописывает их и копирует в проект. Думаю, аналогичные механизмы присутствуют в Eclipse и Netbeans.
В последнем примере ошибка в самом начале:
ОтветитьУдалитьString json = "{paramsArray: [\"first\", 100],"
+ "paramsObj: {one: \"two\", three: \"four\"},"
+ "paramsStr: \"some string\"}";
JSONParser parser = new JSONParser();
Object obj = parser.parse(json);
Переменной jsonString не было объявлено.
CroWell, опечатка, поправил. Спасибо!
ОтветитьУдалитьАлексей Голобурдин, JsonObject jo и JsonArray ja. разве JSON не с большой буквы надо писать?
ОтветитьУдалитьСпасибо за статью=). Очень помог разобраться=)
Работать с Форматом JSON, придется и на стороне сервера, так что всем кому интересно советую прочесть этот материал:
ОтветитьУдалитьКак работать с форматом JSON на PHP
Безбожно ругается на этот код:
ОтветитьУдалить"Unexpected character (p) at position 1.
at org.json.simple.parser.Yylex.yylex(Yylex.java:610)
at org.json.simple.parser.JSONParser.nextToken(JSONParser.java:269)
at org.json.simple.parser.JSONParser.parse(JSONParser.java:118)
at org.json.simple.parser.JSONParser.parse(JSONParser.java:81)
at org.json.simple.parser.JSONParser.parse(JSONParser.java:75)".
Такой код рабочий:
ОтветитьУдалитьString json = "{\"paramsArray\": [\"first\", 100], "
+ "\"paramsObj\": {\"one\": \"two\", \"three\": \"four\"}, "
+ "\"paramsStr\": \"some string\"}";
JSONParser parser = new JSONParser();
Object obj = parser.parse(json);
JSONObject jsonObj = (JSONObject) obj;
System.out.println(jsonObj.get("paramsStr"));
// some string
JSONObject jo = (JSONObject) jsonObj.get("paramsObj");
System.out.println(jo.get("three"));
// four
JSONArray ja = (JSONArray) jsonObj.get("paramsArray");
System.out.println(ja.get(1));
// 100
Подчеркивает строку - parser.parse(json);
ОтветитьУдалитьКакая у Вас версия json-simple?
У меня - json-simple-1.1.1
То же самое. Подскажите, как исправить?
Удалитья javы маму ебал
ОтветитьУдалитьФу гадость какая! Из за таких вот асоциальных элементов хочется мочить жалких людишек направо и налево.
Удалитьа я его папу и сестру! Пидарская java! элементарно распарсить ебаный json это целый пиздец! нахуя эти пидары не могли сделать 1 ебаную функцию parseFuckingJson(fuckingJson); вместо того чтобы создавать миллион библиотек!
УдалитьДля этого создали не функцию (и даже не метод) а целую кучу функциональных языков.
УдалитьБысторо пишется - медленно исполняется.
Ежики плакали, кололись...
УдалитьКому Java не по душе могут идти по известному адресу и писать на том языке, на котором хочет. А я и дальше буду писать на "Пидорской" Java и зарабатывать в четыре раза больше, чем с++ кодер, решая те же задачи.
УдалитьК слову об одной функции.. ИМХО gson больше всего похож на самую простую библиотеку.
УдалитьБля пиздец вы тут развели... Java, плюсы... Оба языка хороши под свои нужды... Попробуй напиши на плюсах сервлет, а на java нативный драйвер шины PCI к примеру хотя бы... Если с первым справишься, со вторым Х*Й когда...
УдалитьКаждый язык предназначен для решения определённого круга задач. На асме тоже можно написать сервлет, но это будет очень долго и не рентабельно. На C# тоже не напишешь нативный драйвер, например. Богатый выбор библиотек Java позволяет быстро решать задачи используя уже реализованный функционал, а не изобретать велосипед каждый раз. Больше библиотек хороших и разных!
Удалитьpublic class Settings {
ОтветитьУдалитьprivate static Settings _instance = null;
private JSONObject cfg = null;
private String fileName = "config.cfg";
private Settings() throws Exception {
Path p = Paths.get(fileName);
if (Files.exists(p, LinkOption.NOFOLLOW_LINKS)) {
JSONParser parser = new JSONParser();
Object obj = parser.parse(new FileReader(fileName));
cfg = (JSONObject) obj;
} else {
CreateDefaultCfgFile();
System.out.println("File \"Config.cfg\" was created");
System.exit(0);
}
}
public synchronized ArrayList getPort() throws Exception {
JSONArray ja = (JSONArray) cfg.get("port");
ArrayList data = new ArrayList<>();
for (int i = 0; i < ja.size(); i++) {
data.add(ja.get(i).toString());
}
return data;
}
private void CreateDefaultCfgFile() throws Exception {
JSONObject json = new JSONObject();
JSONArray port = new JSONArray();
port.add("COM9");
port.add("/dev/ttyUSB0");
json.put("port", port);
String s = json.toJSONString();
try (FileWriter f = new FileWriter(fileName, false)) {
f.write(s);
}
}
public synchronized static Settings getInstance() throws Exception {
if (_instance == null) {
_instance = new Settings();
}
return _instance;
}
}
Так то получше будет. Что то у вас код в примере не очень супер..
Хорошее изложение темы
ОтветитьУдалитьimport sun.org.mozilla.javascript.json.*;
ОтветитьУдалитьАвтор дебил, вот что я хочу сказать.
ОтветитьУдалитьОбажаю явку) Плюсики просто сосут со своей сложностью и синтаксисом позапрошлого века, шарп - нах, ибо микрософт, питон для фанатов, ну пхп и так понятно.. Разобраться, так и альтернативы достойной Яве просто нету.
ОтветитьУдалитьВот прям от души написано, друг мой, поддерживаю!!!)))))
УдалитьО, да! Графоманство в Яве зашкаливает. Сравнивать с Delphi, например, вообще не приходится. Жаль, нынче Делфи уже не используется, а в 90-х от Явы плевались.
УдалитьА ещё раньше плевались когда девушки в штанах ходить начали.
УдалитьЭто я к тому что все меняется и развивается
Спасибо за статью
ОтветитьУдалить> так и альтернативы достойной Яве просто нету.
ОтветитьУдалитьВот это поворот! Невыносимо избыточной яве нет альтернатив. Ну, как говорится, кому и кобыла - невеста.
В точку )
УдалитьОгромное спасибо автору за эту статью! =) Изучаю java всего второй день, ради экстренного написания программ с xml, json и protobuf, и настолько понятная статья - как раз то, что мне нужно хд Гран мерси.
ОтветитьУдалитьОтлично, рад, что помогло! Для второго дня Java - то, что нужно:)
УдалитьСпасиб
ОтветитьУдалитьПривет!
ОтветитьУдалитьпример взял Ваш, самый первый, но почему-то ява выдаёт ворнинг следующего вида:
RTT.java:309: warning: [unchecked] unchecked call to put(K,V) as a member of the raw type HashMap
resultJson.put("num",new Integer(100));
и таких 4. Есть какие-то идеи? гуглинг не помог.
ПИШУ НА ПХП И Я ЛОЖИЛ ХУЙ НА ВАШУ ДЖАВУ
ОтветитьУдалитьНу и напиши же *.apk на пхп...
УдалитьНу и забей отверткой миллион гвоздей. Пыха не для этого создана, чтобы генерить apk файлы. А для написания веб приложения по мне на пыхе удобнее писать
Удалить=_\
УдалитьЗамечательно, а как с помощью симпла распарсить вот такую вот нотацию JSONа:
ОтветитьУдалить"university":
{
"students":
{
"petrovmb":
{
"name": ["petrov", "micael", "borisovich"],
"telephones": ["1381", "1685"]
}
},
}
Т.е., по сути, структуру с тремя степенями вложенности, с учетом, что программе нужен доступ к каждому уровню непосредственно: к примеру, нужно обратиться к имени первого и второго уровня для решения каких-то задач.
Спасибо за статью
ОтветитьУдалитьАвтор настолько крутой, что поддерживает свою крутость использованием сторонних библиотек
ОтветитьУдалитьвроде подключил все правильно саму библиотеку json-simple
ОтветитьУдалить(import org.json.simple.JSONObject;)
но ругается на
JSONParser parser = new JSONParser();
грит не занет такого класса !!!
подключите парсер.
Удалитьimport org.json.simple.parser.JSONParser;
Спасибо!
УдалитьObject obj = parser.parse(json);
ОтветитьУдалитьparse - не видит, пишет "cannot resolve method..."
что делать, помогите пожалуйста
json.toJSONString()
ОтветитьУдалитьvery nice
ОтветитьУдалить