:: Visual Foxpro, Foxpro for DOS
Как раскодировать текст в JSON в формате
OlegA

Сообщений: 536
Откуда: Иркутск
Дата регистрации: 22.06.2001
Добрый день.
Подскажите как на фоксе раскодировать текст типа u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435
в читабельный вид.
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Прямо ТОЧНО такая строка приходит?
У json другой формат. к тому же обрамление {}
Там все просто (по памяти, могу где то ошибиться)
{
"field1":"Some"
"field2":123
}
В общем обычные {key:value}


------------------
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
of63
Автор

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Например, врукопашную (разбирая строку).
Вот кусок, которые это делает, не для копирования текста проги, а комментарии почитать...
Часть текста скрыта
CASE m.cCMD="JSON" .AND. !modaКодирование && JSON-раскодирование, "\u042f" --> "Я", раскодируются только русские буквы!
m.t = m.r && исходная JSON-закодированная строка
m.r = "" && возвращаемая ASCII-строка
m.a = CURtoUNICODE(1) && границы диапазона UNICODE-кодов для букв текущей локали (для русской CP=1251 - 0x0400-0x045F)
m.b = CURtoUNICODE(2)
m.i = 0 && счетчик символов в исходной строке
m.k = LEN(m.t)
DO WHILE m.i<m.k && перебираем входные символы
m.i = m.i + 1
m.l = SUBSTR(m.t, m.i, 1)
IF m.l="\" .AND.; && JSON-декодируемые символы представлены в строке как 6-байтовые слова, типа "\u042f" (русская буква "Я")
m.i+5<=m.k
m.x = SUBSTR(m.t, m.i+1, 5) && считываем еще 5 символов, типа "u042f"
IF m.x="u"
m.x = iSUBSTR(m.x, 2.1, -4) && считать число, представленное нибблами - 4ками битов (символами "0-F"), 4 символа, первая 4ка в строке - старшая в числе
IF !ISNULL(m.x) && если все 4 символа - "0-F"
IF BETWEEN(m.x, m.a, m.b) && это (2х-байтовое) число - UNICODE-буква славянских алфавитов из кодировки ISO 8859-5
m.l = UNICODEtoCUR(m.x) && меняем байты местами, интерпретируем как UNICODE, должна получиться русская ASCII-буква...
m.i = m.i + 5
ENDIF
ENDIF
ENDIF
ENDIF
m.r = m.r + m.l
ENDDO && перебирали входные символы
* Также в JSON предполагается раскодировать некоторые символы (типа, [<>'"]), примерно как для XML... а {} и др. скобки надо?...
* Также в JSON предполагается раскодировать заэкранированные символы: \" - это КВЧ, которые не считать JSON-разделителями, но считать как КВЧ ВНУТРИ JSON-элемента
* Но делать это надо ПОСЛЕ распарсивания на элементы (символы-разделители: {}[] и ЗПТ,КВЧ), и только для значений каждого элемента по отдельности (иначе потом не распарсишь)
* m.r = XMLencodedToCUR(m.r)

Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Вообще, формат называется Unicode Escape Sequence. Используется много где, а не только в JSON.
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
OlegA

Сообщений: 536
Откуда: Иркутск
Дата регистрации: 22.06.2001
of63
Можете поделиться функциями UNICODEtoCUR и CURtoUNICODE
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
of63
Автор

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Ratings: 0 negative/2 positive
Re: Как раскодировать текст в JSON в формате
andrewk

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
Если всё-таки интересует именно то, как озаглавлена тема (работа с JSON-строками), есть вот штука: nfJson. Мне оттуда нужен был только парсер nfJsonRead.prg, во вложении – он и поясниловка для себя.
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
Grin

Сообщений: 1083
Откуда: Kiev
Дата регистрации: 05.12.2000
По моему Igor Korolyov когдато выкладывал

FUNCTION Json_To_Win1251
LPARAMETERS tcText
LOCAL lcRes, lnPos
lcRes = ""
lnPos = 1
DO WHILE m.lnPos <= LEN(m.tcText)
IF SUBSTR(m.tcText, m.lnPos, 2) = "\u"
lcRes = m.lcRes + STRCONV(STRCONV(SUBSTR(m.tcText, m.lnPos + 4, 2) + SUBSTR(m.tcText, m.lnPos + 2, 2), 16), 6)
lnPos = m.lnPos + 6
ELSE
lcRes = m.lcRes + SUBSTR(m.tcText, m.lnPos, 1)
lnPos = m.lnPos + 1
ENDIF
ENDDO
RETURN m.lcRes

Для роботы с Json форматов использую класс vfpjson
пока не разу не подводил.
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
OlegA

Сообщений: 536
Откуда: Иркутск
Дата регистрации: 22.06.2001
of63, Grin
Большое спасибо за помощь.
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
Grin

Сообщений: 1083
Откуда: Kiev
Дата регистрации: 05.12.2000
Добрый день коллеги.

Появилась задача получения данных от сторонних сервисов.
Данные прилетают в json.
Нарисовал получение и обработку данных, все работает, вот только меееееддддллллеееееннннноооо.
Основной затык в преобразовании кодировки.
Json прилетает от 300 кило до 3 метров.
Посоветуйте альтернативу посимвольному декодирования json.



Исправлено 1 раз(а). Последнее : Grin, 26.12.19 15:44
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Так может, если посмотреть на реальный пример (программа и данные), то и подсказали бы, как можно (если можно) его ускорить.

PS
И что такое "медленно" для 3 мегов?



Исправлено 1 раз(а). Последнее : akvvohinc, 26.12.19 16:19
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
Grin

Сообщений: 1083
Откуда: Kiev
Дата регистрации: 05.12.2000
Пардон, пишу с телефона.

Пример экранированого юникода в первом посте топика.
Преобразование в cp1251 функцией Json_To_Win1251 код функции выше.

Медленно это 30-40 минут, что не удивительно при посимвольной обработки трех метровой строки.

Тот-же текст через сайт декодера json конвертируется за секунды...

Может есть у вин 10 апи для преобразования кодировки.
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Попробуйте такое. Должно чуток побыстрее работать.
FUNCTION Json_To_Win1251
LPARAMETERS tcText
STRTOFILE(tctext, "tmp.tmp")
hnd = FOPEN("tmp.tmp")
LOCAL lcRes, m.ch, m.ch1
lcRes = ""
DO WHILE !feof(hnd)
m.ch = FREAD(hnd, 1)
IF (m.ch != "\")
lcRes = lcRes + m.ch
else
m.ch1 = FREAD(hnd, 1)
IF (m.ch1 != "u")
lcRes = lcRes + m.ch + m.ch1
ELSE
m.ch = FREAD(hnd, 2)
m.ch1 = FREAD(hnd, 2)
lcRes = m.lcRes + STRCONV(STRCONV(m.ch1 + m.ch, 16), 6)
ENDIF
ENDIF
ENDDO
FCLOSE(hnd)
ERASE "tmp.tmp"
RETURN m.lcRes
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Grin
Пример экранированого юникода в первом посте топика.
Прелестно! Пишем про json, но в качестве примера предлагаем юникод...
Цитата:
Медленно это 30-40 минут, что не удивительно при посимвольной обработки трех метровой строки.
И для проверки скоростных характеристик предлагается строка размером аж в целых 8 символов... Результат будет очень показательным.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Хотелось бы уточнить один момент. Для чего надо перекодировать входной файл?

У меня есть кое-какой опыт обработки json-файлов.

Сначала я загонял входной файл в поле примечаний. Потом обрабатывал заголовок Json-файла. После этого переходил собственно к самим данным. При этом считывал текущую запись (то, что расположено внутри фигурных скобок). Далее обрабатывал экраеированные символы (при их наличии в записи). После этого обрабатывал свойства записи.
При такой последовательно обработке "по идее" всё должно обрабатываться довольно быстро.
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
sphinx

Сообщений: 31180
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
OFFTOP ON

Всегда умиляло Сереги Сизова "Прелестно!"

OFFTOP OFF



Если по теме... Вот есть такая библиотека для работы с JSON - github.com


------------------
"Veni, vidi, vici!"(с)




Исправлено 1 раз(а). Последнее : sphinx, 26.12.19 22:32
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
Grin

Сообщений: 1083
Откуда: Kiev
Дата регистрации: 05.12.2000
2SSA
Сергей,
Не могу писать с рабочей машины, доступ в интернет ограничен.
Выложить пример трехметрового json немогу, останусь без работы.
По кодировке может и ошибаюсь, но вроде на глаз определил правильно.
Задавая вопрос надеялся на опыт коллег.


2Simple777
Идею понял, сначала разбор json потом декодирование кирилици.
Спасибо попробую.


2Leonid
Тоже идею понял, попробую, спасибо.


2Sphinx
Уже использую подобный клас.
За ссылку спасибо.
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Медленно это 30-40 минут, что не удивительно при посимвольной обработке трех метровой строки.
Да нет, для такого мизера как 3 мега это очень даже удивительно.
Вот если бы речь шла о компьютерах конца 80-х - начала 90-х...
Или о супер-пупер "мощном" алгоритме...

leonid
Попробуйте такое. Должно чуток побыстрее работать.

Там не чуток, а в разы должно быстрее работать.
Обработка не выглядит "супермощной", а посимвольное чтение из файла такого размера занимает менее 10 секунд.

Основные потери, очевидно, занимает посимвольное извлечение из длинной строки с помощью SUBSTR().



Исправлено 1 раз(а). Последнее : akvvohinc, 27.12.19 01:25
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Grin
По кодировке может и ошибаюсь, но вроде на глаз определил правильно.
Речь не про правильность определения кодировки, а про называние вещей чужими именами. Юникод с кодировками и JSON - разные вещи.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Как раскодировать текст в JSON в формате
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
ssa
а про называние вещей чужими именами. Юникод с кодировками и JSON - разные вещи.

"Прелестно".
Ещё бы понятия не называть вещами.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 32 (Гостей: 32)

© 2000-2024 Fox Club 
Яндекс.Метрика