Как стать автором
Обновить

Комментарии 15

Расчитывал увидеть идею, как забирая из json структуру типа Map<String,Object>, понять достоверно без костылей, что забираемая строка это не String, а Date. Но не увидел :(

Извините, я ничего не понял. Можете пример привести?

Допустим есть объект

{ key:value, "age":100, "gender":"m", "active":true, "docs":[{"type":1},{"type":2}]}

тогда он автоматом приводится к map<key, object>, где object это число, бул, строка, массив, вложенный map ( вложенный {}). То есть по всем доступным типам данных в json мы можем создать мапу и там будет объект правильного типа. Но не Date. Ну и не byte[]. Но меня в первую очередь дата интересует. Как дату отличить от строки, которая выглядит как эта самая дата? Только предположением, что если вот такой формат, то Date?

А в обратную сторону такая map<key, object> хоть в json , хоть в xml идеально перегоняется. Храним так произвольные структуры данных.

Если нужно догадываться: лежит ли там дата-время или просто на неё похожая строка, то у меня решения нет (да и не может быть, если эта информация утеряна). А вот если отправитель вам к данным приложил схему типов (либо у вас контракт), тогда можно:

JSONSon.make({
  age: 'number',
  gender: 'string', // хороший пример: можно сделать что-то типа enum
  active: 'boolean',
  docs: [
    { type: 'number' } // или тут имеется в виду какой-то конкретный тип?
  ]
}, yourData);

Как дату отличить от строки, которая выглядит как эта самая дата?

Никак, и не надо. Потому что у Вас может быть текстовое поле, в которое пользователь может вписать что угодно. Если он впишет дату, то после конвертации в Date у Вас где-то упадёт toLowerCase().

Потому только в явном виде. Придётся в парсер передать как-то информацию, что тут именно дата.

А, ну и да: дату эта штуковина, разумеется, тоже умеет переваривать, но только если вы знаете, что ожидается именно она:

JSONSon.make({
  age: 'number',
  active: 'boolean',
  timeJoined: Date,
}, yourData);
НЛО прилетело и опубликовало эту надпись здесь

Да, и мне нравится :)

А что именно вы считаете извращением? Какие-то конкретные решения или в принципе разработку инструмента (вместо использования одного из сотни других)?

Замахнулся я на домашнюю версию Google Photo для запуска на одноплатнике


Я недавно искал как раз вот это. Не совсем такой набор фич, но довольно близко:
github.com/bpatrik/pigallery2

И стэк такой же: NodeJS + JS

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

Да, пользуюсь около года. Есть некоторые баги, но в общем — доволен.

Да, всё основана на файловой системе, хотя к следующему релизу вроде планируют добавить timeline.

Панорамы показываются простой картинкой.

Из интересного — есть интеграция с ffmpeg, когда любые видики могут перекодироваться для показа в браузере. Но я этим не пользуюсь.
Заявляют легковесность, что работать может даже на raspberry.

В порядке эксперимента, вот пример моей папки 2021 года:
pix.slavikf.com/share/872da85a

Заодно и проверим, не ляжет ли под хаброэффектом — это запущено под докером на моей Synology ds1621xs+.

Ко внешнему виду придраться можно, но как же шустро работает! Спасибо, изучу её поподробнее

Делал похожую штуку:

class Serializer {
    #typeMap = new Map();

    registerType(typeName, typeRef) {
        this.#typeMap.set(typeName, typeRef);
    }

    registerTypes(types = {}) {
        for (const typeName of Object.keys(types)) {
            this.registerType(typeName, types[typeName]);
        }
    }

    serialize(value) {
        const typeMap = this.#typeMap;
        // eslint-disable-next-line func-names
        return JSON.stringify(value, function (key, v) {
            const rv = this[key];
            if (typeof rv === 'object' && rv?.constructor?.name) {
                const className = rv.constructor.name;
                if (typeMap.has(className)) {
                    return {
                        className,
                        value: rv.toJSON()
                    };
                }
            }
            return v;
        });
    }

    deserialize(str) {
        return JSON.parse(str, (key, v) => {
            if (typeof v === 'object' && v?.className) {
                const Class = this.#typeMap.get(v.className);
                if (Class) return new Class(v.value);
            }
            return v;
        });
    }
}

Наверняка какой-нибудь npm пакет такое же делает.

Да, если без нюансов, то мне бы такой вариант для решения задачи тоже подошёл. Но с нюансами интереснее :)

Мне кажется что вы изобрели GraphQL без QL...

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории