Комментарии 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...
Восстановление типов JSON