Pull to refresh

Comments 21

Ну это же ненормальное программирование. Оно не должно что-то давать. Оно просто есть.

В качестве одно из примеров применения могу предложить передачу объектов, содержащие значения не входящие в спецификацию JSON. Для простоты возьму ObjectId из MongoDB.

Вот берем какой-нибудь документик:

{
  _id: ObjectId("562d2063bc0f12de6a000001")
}


Этот документ, не является валидным JSON.

А мы возьмём и преобразуем его в JSON-формат:
{
  "t": "object",
  "v": [{
    "n": "_id",
    "t": "objectid",
    "v": "562d2063bc0f12de6a000001"
  }]
}


И всё, теперь это валидный JSON. Написать функцию восстановления тоже не составит труда.
Что-то не понимаю примера. Берем BJSON и перегоняем в NSNJSON только из-за того, что можем так сделать?
:) пример демонстрирует один из способов применения. Примером я хотел показать, как передавать данные, которые не являются валидным JSON. Хотелось придумать формат, который основывался на каком-нибудь известном формате и требовал бы минимум усилий для написания драйверов для этого формата.
Не лучше ли вместо JSON использовать более приспособленные для этого форматы?
Можно. Почему бы нет?! :)

Я ставил задачу реализовать все множество JSON на основе лишь его подмножества. И более-менее формально описал процесс. Не нужно думать, что я предлагаю какое-то новое решение для промышленных задач. Вовсе нет. Просто была идея и просто она реализованна! :)
Только вот
ObjectId("562d2063bc0f12de6a000001").str === "562d2063bc0f12de6a000001"


Cледовательно,
{
  "_id": "562d2063bc0f12de6a000001"
}


И никакой магии.

Но уж если хочется странного, то логичнее:

{
  "_id": {"$objectid": "562d2063bc0f12de6a000001"}
}


Тогда будет много проще написать свой сериализатор/десериализатор как функцию второго аргумента JSON.stringify(value[, replacer[, space]])/JSON.parse(text[, reviver]).
Как потом понять что это был именно ObjectId из такого объекта:
{
  "_id": "562d2063bc0f12de6a000001"
}

?

Это еще один способ, да. Но лично мне не нравится это тем, что приходится явно указывать «строение» id.
А никак. Единственное полезное, что можно сделать с полем _id — это прочитать его, и, в крайнем случае, сконструировать новый такой же объект:
ObjectId(data._id)


Понятно, что вы это делаете без особого смысла, но по пути вы потеряли очень полезное, на мой взгляд, свойство JSON-а: человекочитаемость.
Один способ, как сохранить это свойство и передать тип я уже назвал. Только что придумал еще один:
{
    "_id": ["objectid", "562d2063bc0f12de6a000001"],
    "array": ["array", []]
}

{
  "": ["null"]
}


Не так сильно раздувается размер, и не так сильно страдает читаемость.
UFO just landed and posted this here
Так можно и одним типом string обойтись. И передавать через JSON не только невалидный JSON, но и код в любом другом формате или на языке программирования. Надо будет просто функцию восстановления написать.
{
    value: "................................................"
}
Мне не понравилась такая идея и я решил изобрести NSNJSON. К тому же в Вашей идее необходимо знать природу этих данных. Здесь же всё прозрачно и универсально.
Можно проще: "................................................"
А еще можно взять и поменять местами все буквы на клавиатуре.
осталось только добавить схемы и назвать jsoap
Уважаемые, почему такая реакция в разделе «Ненормальное программирование»? :) Решение не предлагается для промышленного внедрения. Преследовалась совершенно простая цель. Никаких намеков на производительность и крутость! :) Разве данная статья противоречит правилам Хабра или раздела «Ненормальное программирование»? :) За что минусы-то? :)
Я думаю потому, что приведенное решение не только не нормально, но еще и поставленную вами же задачу не решили.
Вы решали задачу, как представить в JSON произвольные типы, но получилось у вас только усложнить синтаксис, а произвольные типы все еще представить не удалось (корежить человекопонятный жисон, и все равно передавать не тип, а строку — это не решение).

Встроить в жисон интерпретатор брейнфака, и декодировать им значения — отличная идея. Превращать старый добрый словарь в массив объектов — нет.
Вы решали задачу, как представить в JSON произвольные типы, но получилось у вас только усложнить синтаксис, а произвольные типы все еще представить не удалось (корежить человекопонятный жисон, и все равно передавать не тип, а строку — это не решение).


В чем конкретно мне не удалось решить поставленную задачу представления JSON типов? Прошу отметить, что в статье речь идет исключительно о null, true, false, number, string, array, object.

корежить человекопонятный жисон, и все равно передавать не тип, а строку — это не решение


Я если честно, не понял Ваш этот комментарий.
Да, каюсь, это я не внимательно прочитал, думал, что речь идет о вообще любых типах.

Чуть выше уже ответил: речь об удобстве чтения формата человеком.
Sign up to leave a comment.

Articles