Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];

Вниз

JSON в дельфи   Найти похожие ветки 

 
Суслик_   (2009-10-03 12:40) [0]

Здравствуйте. Кто-нибудь использует JSON в дельфи?

Чем пользуетесь? Я вот нашел http://www.progdigy.com/?page_id=6. Пользуется кто-то? Как впечатления?


 
Kerk ©   (2009-10-03 14:58) [1]

Я юзал это.
http://sourceforge.net/projects/lkjson/

Там есть небольшой баг при работе с юникодом в Д2009. Я исправил, но автор почему-то на баг-репорт не отреагировал. В общем, если надо, я покажу где и что.


 
sniknik ©   (2009-10-03 15:09) [2]

пользуемся, а то, только мне не приходилось принимать данные, поэтому надобности в разборе/построении объектов не было (на вход все xml да xml, не от меня зависит), а на выдачу проще составить самому (выдача в html страницу (аякс), поэтому и выбор json (полностью мой выбор, т.к. страничка тоже моя, хотя сторонники xml в лице начальника отдела пытались и туда заставить xml "притулить"), а не xml, т.к. он для джаваскрипта практически родной объект, преобразований не требуется (если не заморачиваться безопасностью, и не использовать парсер для обхода возможной дыры, а у меня не та ситуация)).

там на родной странице json-а (json.org), кроме "твоего",  еще два варианта есть
http://sourceforge.net/projects/is-webstart/
http://sourceforge.net/projects/lkjson/


 
TIF ©   (2009-10-03 18:29) [3]

> Я вот нашел

JSON - SuperObject смотрел, качал, но не использовал ещё, надобности пока не было :)
Два других варианта с JSON.org тоже качал, смотрел. В общем моё мнение - лучший SuperObject. Особенно прельщают:
- Fastest JSON parser for Delphi.
и
- Easy to use.


 
Суслик_   (2009-10-03 23:27) [4]

Стремные у этих библиотек интерфейсы какие-то.
))

Да и демки так себе.

Но, видимо, причина в том, что интерфейсы заточены на большие объемы обрабатываемых данных...


 
Суслик_   (2009-10-05 22:22) [5]


> sniknik ©   (03.10.09 15:09) [2]
>
> пользуемся

Так ты какой именно пользовался библиотекой?


 
Дмитрий Белькевич   (2009-10-05 23:21) [6]

http://sourceforge.net/projects/lkjson/

для 2009-й тоже пришлось править.


 
Суслик_   (2009-10-05 23:29) [7]

что-то мне эта библиотека активно не понравилась - я попробовал задать некорректный JSON - она AV выдала.

Как-то несерьезно это.


 
Дмитрий Белькевич   (2009-10-05 23:35) [8]

>что-то мне эта библиотека активно не понравилась - я попробовал задать некорректный JSON - она AV выдала.

Кто без греха?

>Как-то несерьезно это.

несерьёзно надеятся, что в программе сложнее hello world багов совсем нет.


 
Суслик_   (2009-10-07 00:34) [9]

Уважаемые, пролейте свет на вопрос.

Скажите, пожалуйста, является ли следующий JSON валидным?

начало
{"name":"дима"}
конец

или валидный JSON обязан содержать только UNICODE, в частности UTF8?

Вопрос возник потому, что я хочу использовать JSON для ручного редактирования определенных данных, которые, в том числе, содержат русские символы. Я что-то совсем с этим уникодом запутался...


 
Kerk ©   (2009-10-07 01:29) [10]


> Суслик_   (07.10.09 00:34) [9]
> или валидный JSON обязан содержать только UNICODE, в частности UTF8?

Я не знаю точно, но если попробовать мыслить логически...
JSON - это JavaScript Object Notation, а свойства объектов JavaScript могут быть в любой кодировке.


 
TIF ©   (2009-10-07 02:11) [11]

> или валидный JSON обязан содержать только UNICODE, в частности
> UTF8?

The character encoding of JSON text is always Unicode. UTF-8 is the only encoding that makes sense on the wire, but UTF-16 and UTF-32 are also permitted.

http://json.org/fatfree.html


 
Kolan ©   (2009-10-07 10:43) [12]

Про YAML знаете? Он экономнее. Просто информация.


 
Суслик_   (2009-10-07 11:05) [13]

2Kolan
Под YAML я не нашел парсера на дельфи. Писать сам не хочу.

2TIF
Понял. После вопроса почитал про кодировки и понял одну важную вещь - {"name":"дима"} валидный JSON, если это редактировать в допустимой уникодной кодировке.

Да... надо покупать Delphi2009 и разбираться с уникодом )
Там все вроде уникод.


 
sniknik ©   (2009-10-07 12:32) [14]

> Да... надо покупать Delphi2009 и разбираться с уникодом )
> Там все вроде уникод.
у меня все в D7, как то так получилось, что не озабачивался этим вопросом (только отсюда узнал что есть проблема), просто страничку сразу начал делать в utf-8, а в сервлете на delphi естественно все ответы страничке конвертил к нему... т.е. не потому, что проблема, а потому что раз выбрал кодировку то нужно ее придерживаться. функция конвертации в 7-е есть, да и в 2009 также придется если выбрать utf-8.

и кстати utf-8 это не юникод. позволяет тоже, но другими методами (юникод все символы представляет в расширенном, двухбайтном наборе, а у utf-8 представление различной комбинацией байт)


 
Суслик_   (2009-10-07 13:35) [15]

2sniknik

1) Если машиной читать и машиной писать, то все равно какая кодировка.
Я же хочу, чтобы это были файлы конфигурации, которые в обозримом будущем будут писать руками. Поэтому озаботился.

2) SeperObject может вообще "забить" на уникод и работать всегда с Ansi. Пока буду использовать его именно так.

3) Ты не сказал, какой сам библиотекой пользуешься.

4) Про то, что такое UTF-8 я знаю. Насчет того, что уникодом имеет право называться двухбайтовая комбинация ты не прав.


 
sniknik ©   (2009-10-07 14:06) [16]

> 3) Ты не сказал, какой сам библиотекой пользуешься.
sniknik ©   (03.10.09 15:09) [2]
> только мне не приходилось принимать данные, поэтому надобности в разборе/построении объектов не было
>...
> а на выдачу проще составить самому

в страничке(яваскрипте) же, практически ничего не нужно (можно... но не нужно), обьект строится функцией eval, точнее -
var js = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(data.replace(/"(\\.|[^"\\])*"/g, ""))) && eval("("+data+")");

if (!js) alert("пошли вы нафик с таким json-ном")
else {работаем ... js.name ...}


 
sniknik ©   (2009-10-07 14:12) [17]

> что уникодом имеет право называться двухбайтовая комбинация ты не прав.
не двух, может и трех четырех не принципиально (просто счас в основном двух), главное то, что в таком представлении ВСЕ символы, а то где часть кодировки (английские) есть обычный ansi, а остольные варьируются в различном количестве байт на символ - не юникод.
часто слышал название - транспортная кодировка.

спроси АП. если мне не веришь.


 
Anatoly Podgoretsky ©   (2009-10-07 20:31) [18]

> sniknik  (07.10.2009 14:12:17)  [17]

Транспортная "кодировка" это когда текст преобразовывается в форму пригодную для транспортировку по каналам связи, типичные представители utf8 (для передачи уникода), base64/qp/hex и  другие подобные используются для траспортировки не текстовых данных. Связано это с тем, что Интернет (каналы) по сути текстовый и так просто передавать двоичные данные, без преобразования (transformation) нельзя. UTF-8 иногда используют и не для транспортировки, а для хранения текстовых данных, по той же причине, чтобы можно было открыть любым текстовым редактором. UTF-8 по сути AnsiString, особая форма.


 
Дмитрий Белькевич   (2009-10-08 02:51) [19]

Повторю. В этом:

>http://sourceforge.net/projects/lkjson/

есть проблема в 2009-й (по крайней мере, в той версии, что я качал). Я у себя исправил, всё заработало. Возможно у топикстартера эти же проблемы (что-то как раз с utf8 было, насколько помню).

Если нужно -то могу отдать поправленное.


 
Суслик_   (2009-10-08 11:48) [20]

Спасибо всем. Пока на тему "подзабил", но вернусь потом, ближе к делу.


 
Mystic ©   (2009-10-08 18:02) [21]

На счет lkjson... Только что попробовал, наткнулся на неприятную проблему:


 s := "{"string1":"123","\"string2\"":"two\\two","+
   ""childobject":{"objstr1":"Oone","objstr2":"Otwo\\Otwo"}}";
 js := TlkJSON.ParseText(s) as TlkJSONobject;

 s2 := vartostr(js.Field[""string2""].Value);
 writeln(s2);


Такой исходник выводит всего лишь two\tw. Последний символ отгрызен. Ну а попытка это поправить привела в дебри, где


     while (j<=length(txt)) and (txt[j]<>""") do
...


в utf-8 вообще говоря, вторая часть символа может быть равна #34, так что код выглядит очень подозрительно... :) А UTF8ToString вызывается уже перед самым возвратом из js_string...


 
Суслик_   (2009-10-08 18:09) [22]

lkjson имхо вообще поделка.
SuperObject вроде как солиднее.


 
Hint   (2009-10-19 21:21) [23]

Случайно наткнулся на тему.
Неделю назад пришлось самому написать небольшую библиотеку для работы с json. Она очень простая (всего 350 строк), но при этом надежная =)

За раз обрабатывает только один уровень объекта.

http://evermore-world.com/trash/json.zip

Примеры:
var
 json: TJSON;
 s: string;
 i: Integer;
begin
 s := "{"string1":"123","\"string2\"":"two\\two","+
  ""childobject":{"objstr1":"Oone","objstr2":"Otwo\\Otwo"}}";
 json := TJSON.Create(s); // можно указывать json при создании
 ShowMessage(json.GetStr(""string2"")); // two/two
 if not json.Decode(json.GetObj("childobject")) then exit; // можно устанавливать объект через метод Decode (вернет false в случае ошибки)

 for i := 0 to json.Count - 1 do // можно перебрать все объекты
   begin
     ShowMessage(Format("%s: %s", [json[i].Name, json[i].Value]));
   end;
 json.SetStr("objstr1", "new"); // заменяем старое значение
 json.SetStr("hello", "world"); // добавляем новый объект
 json.SetInt("1", 2); // добавляем число
 ShowMessage(json.Encode); // выводим результат
 // {"оbjstr1":"nеw","objstr2":"Оtwo\\Оtwо","hello":"world","1":2}
end;


 
Hint   (2009-10-19 21:24) [24]

Еще немного:
 json.Clear; // очищаем
 json.SetStr("1", "one");
 json.SetStr("2", "two");
 s := json.Encode; // получаем результат
 json.Clear;
 json.SetStr("name", "example");
 json.SetObj("digits", s); // добавляем получившийся объект
 json.SetObj("array","[1,2,3]"); // добавляем произвольный объект (массив)
 ShowMessage(json.Encode);
 // {"name":"examplе","digits":{"1":"оnе","2":"two"},"array":[1,2,3]}
 json.Decode(json.Encode); // для проверки зашифруем и дешифруем
 json.Decode(json.GetObj("array")); //дешифруем объект "array"
 if json.IsArray then // если объект - массив ([])
   begin
     for i := 0 to json.Count - 1 do
       begin
         ShowMessage(IntToStr(json.GetInt(i)));
       end;
   end;


 
TIF ©   (2009-10-19 23:53) [25]

Hint, спасибо, никогда не знаешь, что пригодится, поэтому и эту библиотечку тоже скачал...
Может пошлёшь творение на json.org? :)


 
Дмитрий   (2009-11-12 17:29) [26]

Hint, залей пожалуйста еще раз. По ссылке не доступно.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.017 c
15-1258203058
TRSteep
2009-11-14 15:50
2010.01.17
Сетевея работа


2-1259156997
Анна
2009-11-25 16:49
2010.01.17
Событие в DBGrid или в DataSet ??


15-1257939335
ZeroDivide
2009-11-11 14:35
2010.01.17
Очереной отжиг от Google


2-1258895265
Виктор
2009-11-22 16:07
2010.01.17
Представление данных базы данных в Word


2-1258726068
cukerMAN
2009-11-20 17:07
2010.01.17
От чего идет подвисание программы? Работаю с большой строкой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский