Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.17;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.013 c
2-1259427836
sagitt
2009-11-28 20:03
2010.01.17
Не работает RefResh под Vista


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


4-1226584066
CodeMaster
2008-11-13 16:47
2010.01.17
API функция для изменения шрифта TextOut


2-1258556612
niro
2009-11-18 18:03
2010.01.17
перехватить событие от msie


3-1233431699
123
2009-01-31 22:54
2010.01.17
ПОИСК