Форум: "Прочее";
Текущий архив: 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