Previous Entry Share Next Entry
2016-01

JSON crap

Сегодня я узнал, что в JSON нельзя сериализовать NaN и Infinity :/

Ну а о том, что не всякий валидный JSON является валидным JS (т.е. поддается eval'у), вы и сами знаете.

This entry was originally posted at http://wizzard.dreamwidth.org/380227.html. It has comment count unavailable comments. Please comment there using OpenID.

  • 1
shabunc July 10th, 2014
У меня нет-нет, да и вызывает досаду тот факт, что комменты нельзя писать в JSON-е. Потому что иногда нужно, чтобы мне ни говорили.

wizzard0 July 10th, 2014
И это тоже, да.

vaddimka July 10th, 2014
дык пиши в поле "comment_to_xxx_field" :)

wizzard0 July 10th, 2014
Иногда прокатывает, ага

_winnie July 10th, 2014
Для бесконечности можно писать 1e350

wizzard0 July 10th, 2014
NaN нужнее

enternet July 10th, 2014
Неустаканенность формата дат в джейсоне тоже весьма раздражает.

wizzard0 July 10th, 2014
Ну это да, но там хотя бы можно налепить конвертор в UTC milliseconds since epoch, а с NaN/Infinity хз что делать

jakobz July 10th, 2014
Можно извернуться, кстати:
>JSON.parse('[1,2,"NaN"]', function(str, val) { return val === "NaN" ? NaN : val; })
[1, 2, NaN]

:)

wizzard0 July 10th, 2014
Я тогда лучше YAML возьму

juan_gandhi July 10th, 2014
Или HOCON.

wizzard0 July 10th, 2014
Больше стандартов, хороших и разных! (см. ниже про CBOR)

Эээ, мне одному кажется, что там Java meets Perl? (Не то чтобы это было хорошо или плохо, просто такое впечатление)

Edited at 2014-07-10 05:57 pm (UTC)

juan_gandhi July 10th, 2014
Хм, надо подумать.

vaddimka July 10th, 2014
в CBOR'е можно :)

wizzard0 July 10th, 2014
О, еще один велосипед!

Надо позырить)

wizzard0 July 10th, 2014
> 256-18446744073709551615 First Come First Served

Hell yeah!

Но, вообще говоря, неочевидно почему это будет работать. OIDы лучше.

vaddimka July 10th, 2014
не понял про oid'ы
там есть идентификаторы типов, размер записанный зависит от значения (как в протобуфах например)

wizzard0 July 10th, 2014
у оидов есть иерархия. а тут нет. соотвно мне для моих типов 100500 значений придется резервировать, а не префикс.

vaddimka July 10th, 2014
что? я ничего не понял
у меня сериализация в CBOR отлично легла на существующие JSON сериализаторы (только вместо имен полей сделал цифры, как в гугловом протобуфе опять же)

wizzard0 July 10th, 2014
Посмотри, как устроен OID registry и насколько это удобнее, чем когда IANA заведует всеми ID без исключения.

vaddimka July 10th, 2014
я видимо не знаю твоей специфики и юзкейсов :)

max630 July 10th, 2014
http://vimeo.com/77199361 , смотреть с 17:49

а главное - ну из-за чего хорошего бы, а что такое этот NaN вообще? Я вот не помню ютобы он хоть когда-то был нужен мне.

wizzard0 July 10th, 2014
> смотреть с 17:49
> "Oh dear!
This video can’t be played with your current setup."

Можно TLDR? А то лень сейчас разбираться, что там у флэша снова отвалилось :(

> Я вот не помню ютобы он хоть когда-то был нужен мне.
Не, если пошла такая пьянка, то я и вообще на fixed point могу перейти, или в строку его закодировать. "Но зачем"? Есть же IEEE754, никому не мешает.... -_-

Вот например есть time series data, в которой есть дыры - пакет от устройства не пришел, датчик заглючил, whatever.

Оно в оригинале strongly-typed как double[], нули и бесконечности там валидные значения (NaN ничего не пришло, Infinity "расстояние больше чем мы можем померять")

Ну и прочее подобное, кейсов масса, не зря же их в стандарт запихали

max630 July 10th, 2014
Мне предлагают вроде скачать видео. Но вообще да, видео сосёт, но что есть то есть.

Вкратце - не тащи специфичную семантику своей системы в формат обмена. Тем более такую костыльную.

В формат запихали зря, по-моему. Ну или это просто как затычка была для условий когда нельзя исключение кинуть.

я бы выбрал http://wizzard0.livejournal.com/443485.html?thread=4537437#t4537437. Ну или более строго: ["ok", 42.42] | ["nothing"] | ["too large"]. Хотя возможно это тоже оверкилл

Edited at 2014-07-10 06:22 pm (UTC)

wizzard0 July 10th, 2014
> когда нельзя исключение кинуть.

Численные методы, вот это всё.

max630 July 10th, 2014
я бы сказал, контроллеры всякие.

Но по сути выход один - вот мы обосрались и результат не можем не выдать никакой, значит надо помечать это на выходе. Пожаловаться в stderr и упасть не всегда возможно, значит надо придумать какую-то затычку, которая не пересекается с любым валидным значением. Вот, придумали. Но это они для железки придумали, а в век вебдваноля то эти костыли тащить зачем?

wizzard0 July 10th, 2014
Сложный это вопрос, без однозначного ответа.

anonim_legion July 11th, 2014
>затычку, которая не пересекается с любым валидным значением. Вот, придумали. Но это они для железки придумали

Мне кажется, это из той же серии, когда люди не понимают почему в SQL NULL != NULL


wizzard0 July 11th, 2014
О! Ты меня понимаешь.

SQL NULL - это как раз NaN и есть. Точнее, Not a Value. (Which is not a singleton)

EDIT: точнее, это аппроксимация _|_ (bottom) для языков с eager evaluation

Edited at 2014-07-11 09:45 am (UTC)

wizzard0 July 10th, 2014
> ну из-за чего хорошего бы

Я вот еще скажу контринтуитивную штуку. JSON - это даже не subset JS, можно сгенерить валидный жсон который с радостью будут жрать парсеры (включая Крокфордовский JSON2.js и браузерный JSON.parse), а eval()'ить его будет нельзя!

Edited at 2014-07-10 05:54 pm (UTC)

nponeccop July 10th, 2014
A в YAML есть ссылки.

Я потихоньку начинаю ненавидеть текстовые форматы.

Ещё если много чисел сериализовать, боттлнеком становится itoa/atoi.

wizzard0 July 10th, 2014
Я уже почти созрел чтобы полюбить бомбу, в смысле, ASN.1.

Но там нет ссылок. Не то чтобы они были часто нужны, впрочем...

lionet July 10th, 2014
Да. В ASN.1 можно передать негативный ноль даже.

Там вообще три или больше форматов передачи fp-значений (base-2, base-10, base-16). И все их надо уметь парсить. Кроме моего компилятора ни один опенсорсный (даже эрланговский) не поддерживает этот формат правильно. Например, эрланговский неправильно декодирует... ноль.</p>

Ссылок в ASN.1 нет, зато есть IOC, что вставляет не меньше.


wizzard0 July 10th, 2014
Почитал про IOC. Жесть-то какая. Эээ, и ты, я полагаю, видел его в продакшене, да?

lionet July 10th, 2014
Вижу довольно часто. ROSE его использует, например.

Довольно удобная штука, на самом деле. Гемморой с ним скорее в том, что там уйма возможностей по комбинированию разных сущностей, и они плохо ложаться на синтаксис ASN.1. Из за этого, в частности, ASN.1 abstract syntax — он контекстно-зависимый (!).

sorcerer_ July 11th, 2014
А что в АСН.1 плохого? Юзали и не жужжали в телекомах, пачками.

из твитора

thedeemon July 10th, 2014
PROTIP: Turn data into big data by encoding it as XML.

Re: из твитора

wizzard0 July 10th, 2014
Охуенно.

Re: из твитора

sleepy_drago July 10th, 2014
спасибо =) уволок оригинал на цитаты

lionet July 10th, 2014
MsgPack нормально с floating point обращается. И очень совместим с JSON.

zeux July 11th, 2014
itoa/atoi это еще пол беды (их легко разогнать).
А вот strtod и обратно...

vit_r July 10th, 2014
Так есть же коммитеты по стандартизации. Туда писать надо. Или самому автору.

max630 July 16th, 2014

  • 1
?

Log in

No account? Create an account