Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Семантика Yaml документа.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Несколько раз я ходил вокруг этого формата. И облизывался. Я позиционировал его
как замену Excel в бизнес - коммуникациях. Хотелось уйти от передачи маппингов
в Excel к маппингу в csv/json/yaml. Последний стоял как десерт. Но к сожалению
мне самому надо было понять подводные камни. А именно.

- какие могут быть НЕОДНОЗНАЧНОСТИ (случайный пробел или табулятор слева)
- какие сложности с парсером
- композиции (когда внутрь одного документа заворачивают кусок другого (типа CDATA xml).

И вопросы к аудитории

- как вы применяете этот формат на производтсве?
- какие есть pitfalls
- какие либы (у меня только snakeyaml)
- и самое последнее что меня сильно интересеует - кодогенерация и связи с трансляторами ЯП.

+
В качестве примера. Дан некий софистический документ. Анкета некого Майка.

Я сам его написал с изменениями по туториалу. Он - успешно проходит парсинг. Тоесть он - валиден.

person:
  name: "Mike"
  occupation: 'programmer'
  age: 23
  gpa: 3.5
  fav_num: 1e+10
  male: true
  birthday: 1954-01-02 16:44:00 # This is Standard date
  flaws: null
  hobbies:
    - movies
    - bike
    - hacking
    - singing
  movies: ["Star Wars", "Dark Knigth"]
  friends:
    - name: "Jessica" # Woo-hoo
      age: 22
    - { name: "Bob", age: 26 }
  md5: >
    e4d909c290d0fb1 
    ca068ffaddf22cb
    d0
  signature: |
    Mike
    MIT
    mikemike@gmail.com

Что интересно.

Документ - читабелен для человека не из It. All is clear.

Есть две формы представления array.

Формат даты по ISO.

Есть также некий relaxed-json/Hokoon, тоесть
в некотром роде документ обратно совместим с небольшими изменениями с JSon.

Есть также удобства по добавлению сырых данных в виде авто-подписи Майка.


Вобщем докиньте свои 5 коп.
29 апр 20, 11:52    [22124784]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
chpasha
Member

Откуда:
Сообщений: 9207
mayton
замену Excel в бизнес - коммуникациях

по моим наблюдениям excel это единственный формат, который понимает большинство эникейщиков и замены ему не предвидится, какими бы чудесными не были другие форматы. даже когда просишь сохранить в csv из того же excel, половина не понимает чего от них хотят.
29 апр 20, 12:16    [22124809]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5288
mayton,

А как же старый добрый key-value properties :-)
29 апр 20, 12:31    [22124818]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Я уже много лет подковёрно веду борьбу с Excel. Я выкашиваю его косой и вырубаю топором
из проектов там где есть возможность. И у меня на то есть своя аргументация. Но топик не об этом.

Топик вообще о том как согласовать бизнес требования и код.

Современные Business Analysts - ребята очень грамотные. Знают не только Микросовт-Охвис. Они
нормально оперируют R, Statistica, и скриптуют запросики в MSSQL.

И от yaml нас отделяет только несколько брейнштормов и грумингов идей.
29 апр 20, 12:32    [22124822]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Если развернуть этот документ в дерево LinkedHashMap то вот такое получается.

    key = birthday, value = Sat Jan 02 18:44:00 EET 1954

    key = flaws, value = null

    key = hobbies, value = [movies, bike, hacking, singing]

    key = movies, value = [Star Wars, Dark Knigth]

    key = friends, value = [{name=Jessica, age=22}, {name=Bob, age=26}]


Прикольно что дата распозналась именно как дата.
29 апр 20, 13:56    [22124888]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
    void dumpLhm(LinkedHashMap<String, Object> res, int level) {
        res.forEach((key, value) -> {
            if (value instanceof LinkedHashMap) {
                printf("%skey = %s {\n", indent(level), key);
                dumpLhm((LinkedHashMap<String, Object>) value, level + 4);
                printf("}\n", indent(level), key);
            } else {
                printf("%skey = %s, value = %s\n", indent(level), key, String.valueOf(value));
            }
        });
    }

    @Test
    public void testMike() throws FileNotFoundException {
        Yaml yaml = new Yaml();
        LinkedHashMap<String, Object> res = yaml.load(new FileInputStream("src/test/resources/04-mike.yaml"));        
        dumpLhm(res, 0);
    }
29 апр 20, 13:58    [22124891]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Попробовал посериализировать. Стили стали более унылые и плоские.
Кто знает как управлять? Например я не хочу видеть JSon-like форматирование а
хочу такое с bullets как в исходном документе. (в моём первом посту)

+
    public static void main(String[] args) throws IOException, ParseException {
        Map<String, Object> data = new LinkedHashMap<>();
        data.put("name", "Mike");
        data.put("age", 23);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        data.put("birthday", simpleDateFormat.parse("1954-01-02 16:44:00"));
        data.put("hobbies", new String[] { "movies" , "bike" , "hacking" , "singing" });
        data.put("movies", new Object[] {"Star Wars", "Dark Knigth"});

        data.put("friends", new Object[] {
            new LinkedHashMap() {{
                put("name", "Jessica");
                put("age", 22);
            }},
            new LinkedHashMap() {{
                put("name", "Bob");
                put("age", 26);
            }}
        });

        Yaml yaml = new Yaml();
        FileWriter writer = new FileWriter("build/test.yaml");
        yaml.dump(data, writer);

    }

name: Mike
age: 23
birthday: 1954-01-02T14:44:00Z
hobbies: [movies, bike, hacking, singing]
movies: [Star Wars, Dark Knigth]
friends:
- {name: Jessica, age: 22}
- {name: Bob, age: 26}
29 апр 20, 15:18    [22124969]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3452
mayton
как вы применяете этот формат на производтсве?

Что значит на производстве?

В DevOps скриптах деплоймента, мониторинга и т.п.
29 апр 20, 15:47    [22125001]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Нет. Девопс меня не интересует.

Расскажите о НЕСТАНДАРТНОМ использовании Yaml.
Меня интересует когда Yaml участвует в описании моделей данных.
Энтитей. ДТО. ОРМ-маппинга.

Всё что угодно кроме конфигов.
29 апр 20, 15:52    [22125008]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Управление типизацией (snakeyaml).

+
Я уже выкинул модульный тест. Сделал просто конвертер Yaml=>MOdel=>Yaml.
Просто продолжаю обогащать анкету Майка и смотрю как работает этот pipeline.

In:
person: !!map
  name: "Mike"
  occupation: !!str 'programmer'
  age: !!int 23
  gpa: !!float 3.5
  fav_num: !!float 1e+10
  male: !!bool true
  birthday: !!timestamp 1954-01-02 16:44:00 # This is Standard date


Out:
person:
  name: Mike
  occupation: programmer
  age: 23
  gpa: 3.5
  fav_num: 1.0E10
  male: true
  birthday: 1954-01-02T16:44:00Z
29 апр 20, 18:23    [22125213]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
А вот еще интереснее. Алиасы. У Майка есть брат-близнец Том. Я задаю его дату-рождения через алиасы.

person: !!map
  name: "Mike"
  secondname: &mikesFamily "Thomson"
  occupation: !!str 'programmer'
  age: !!int 23
  gpa: !!float 3.5
  fav_num: !!float 1e+10
  male: !!bool true
  birthday: &mikesBirthday !!timestamp 1954-01-02 16:44:00 # This is Standard date
  flaws: null
  hobbies:
    - movies
    - bike
    - hacking
    - singing
  movies: !!seq ["Star Wars", "Dark Knigth"]
  friends:
    - name: "Jessica" # Woo-hoo
      age: 22
    - { name: "Bob", age: 26 }
    - name: "Tom"
      secondname: *mikesFamily
      birthday: *mikesBirthday


Это похоже на XML entities.

Сообщение было отредактировано: 29 апр 20, 18:31
29 апр 20, 18:32    [22125222]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Есть еще динамическое переопределение алиасов и merge структур. Но мне пока хватит фич. Остановлюсь на этом.
29 апр 20, 18:38    [22125226]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3281
mayton
Несколько раз я ходил вокруг этого формата. И облизывался. Я позиционировал его
как замену Excel в бизнес - коммуникациях. Хотелось уйти от передачи маппингов
в Excel к маппингу в csv/json/yaml. Последний стоял как десерт. Но к сожалению
мне самому надо было понять подводные камни. А именно.

- какие могут быть НЕОДНОЗНАЧНОСТИ (случайный пробел или табулятор слева)
- какие сложности с парсером
- композиции (когда внутрь одного документа заворачивают кусок другого (типа CDATA xml).

И вопросы к аудитории

- как вы применяете этот формат на производтсве?
- какие есть pitfalls
- какие либы (у меня только snakeyaml)
- и самое последнее что меня сильно интересеует - кодогенерация и связи с трансляторами ЯП.

+
В качестве примера. Дан некий софистический документ. Анкета некого Майка.

Я сам его написал с изменениями по туториалу. Он - успешно проходит парсинг. Тоесть он - валиден.

person:
  name: "Mike"
  occupation: 'programmer'
  age: 23
  gpa: 3.5
  fav_num: 1e+10
  male: true
  birthday: 1954-01-02 16:44:00 # This is Standard date
  flaws: null
  hobbies:
    - movies
    - bike
    - hacking
    - singing
  movies: ["Star Wars", "Dark Knigth"]
  friends:
    - name: "Jessica" # Woo-hoo
      age: 22
    - { name: "Bob", age: 26 }
  md5: >
    e4d909c290d0fb1 
    ca068ffaddf22cb
    d0
  signature: |
    Mike
    MIT
    mikemike@gmail.com

Что интересно.

Документ - читабелен для человека не из It. All is clear.

Есть две формы представления array.

Формат даты по ISO.

Есть также некий relaxed-json/Hokoon, тоесть
в некотром роде документ обратно совместим с небольшими изменениями с JSon.

Есть также удобства по добавлению сырых данных в виде авто-подписи Майка.


Вобщем докиньте свои 5 коп.


Есть преобразователь для четырёх типов файлов 22122936.

Мы в основном храним данные в xml и property файлах.
Json для обмена данными между сервером и js кодом.

Хорошего вам дня!
29 апр 20, 19:52    [22125307]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Valentin Kolesnikov, спасибо. Посмотрю.
29 апр 20, 19:53    [22125310]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
У меня щас другая проблема. Я пробую продуктовые данные по бизнес-аналитике сохранять в Yaml.
(раньше мы в Json хранили) и вот это горизональное-вертикальное форматирование коллекций
- сильно мешает.

Грубо говоря оно включается по искусственному интеллекту. Видимо следуя какой-то логике улучшения.
Но мне надо его защёлкнуть только на горизонтальном.

Вот это - неправильно.
hobbies:
    - movies
    - bike
    - hacking
    - singing
  movies: ["Star Wars", "Dark Knigth"]


И я пока не вижу выхода как делать кастомный сериализатор. Хотя не хочу.
29 апр 20, 20:03    [22125322]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3452
mayton
Нет. Девопс меня не интересует.

Расскажите о НЕСТАНДАРТНОМ использовании Yaml.
Меня интересует когда Yaml участвует в описании моделей данных.
Энтитей. ДТО. ОРМ-маппинга.

Всё что угодно кроме конфигов.

Для этого используем Json и XML
29 апр 20, 20:17    [22125331]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
hVostt
Member

Откуда:
Сообщений: 17476
mayton
Несколько раз я ходил вокруг этого формата. И облизывался.

mayton
Вобщем докиньте свои 5 коп.


Так себе формат. Чудовищно переусложнён. В следствие этого, нормальной полной поддержки последней версии формата YAML толком нигде нет. И даже если вы её найдёте/реализуете, пользы от этого мало. Ибо применение всех фишечек приведёт к нечитаемости и неупотребимости.

YAML хорошо подходит именно для ручного использования, т.е. для конфигов.

Для передачи данных лучше использовать JSON/BSON/XML.

В общем, никакого профита, кроме как использования для конфига нет.
30 апр 20, 06:55    [22125510]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
hVostt
Member

Откуда:
Сообщений: 17476
mayton
Расскажите о НЕСТАНДАРТНОМ использовании Yaml.
Меня интересует когда Yaml участвует в описании моделей данных.
Энтитей. ДТО. ОРМ-маппинга.


Для описания моделей данных и типизированного хранения данных всё же лучше XML ничего нет.
Так как в XML можно указывать тип данных и любые другие мета-данные, которые ложатся как влитые.

Что-то подобное делать в JSON/YAML -- это будут очередные кривые костыли, основанные на кривых соглашениях. Да и вообще, нафиг оно там не упёрлось.
30 апр 20, 07:00    [22125512]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5288
hVostt
Для описания моделей данных и типизированного хранения данных всё же лучше XML ничего нет.
Так как в XML можно указывать тип данных и любые другие мета-данные, которые ложатся как влитые.


Тут я с вами поспорил.
Т.к. xml/xsd не совсем однозначно может описывать данные/типы.
Как минимум я регулярно сталкиваюсь с тем, что в зависимости от хинтов xjb можно сформировать разные классы.

В этом плане json проще и надежнее.
Три типа - объект, массив, строка.
Их комбинация позволяет передавать любые данные .
Но в нём проблемы с датами.
30 апр 20, 07:57    [22125524]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
hVostt
Member

Откуда:
Сообщений: 17476
mad_nazgul
Тут я с вами поспорил.
Т.к. xml/xsd не совсем однозначно может описывать данные/типы.
Как минимум я регулярно сталкиваюсь с тем, что в зависимости от хинтов xjb можно сформировать разные классы.

В этом плане json проще и надежнее.
Три типа - объект, массив, строка.
Их комбинация позволяет передавать любые данные .
Но в нём проблемы с датами.


Сравните с количеством примитивов в XML

3.2.1 string
3.2.2 boolean
3.2.3 decimal
3.2.4 float
3.2.5 double
3.2.6 duration
3.2.7 dateTime
3.2.8 time
3.2.9 date
3.2.10 gYearMonth
3.2.11 gYear
3.2.12 gMonthDay
3.2.13 gDay
3.2.14 gMonth
3.2.15 hexBinary
3.2.16 base64Binary
3.2.17 anyURI
3.2.18 QName
3.2.19 NOTATION

Т.е. XML может быть самодостаточен для передачи данных и типов данных. Плюс любое количество аннотаций.

JSON не может быть надёжнее, так как информацию о типе не хранит. Но проще, так как примитивов меньше. По сути основное преимущество JSON в простоте и меньшем количестве оверхеда.

Но это не забесплатно.
30 апр 20, 08:14    [22125525]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
hVostt
Member

Откуда:
Сообщений: 17476
mad_nazgul
Их комбинация позволяет передавать любые данные .


Можно передавать только вот это: объект, строка, массив, число, bool и null. Никакие другие данные передавать нельзя.

Т.е. если я вам пришлю какой-нибудь JSON и не расскажу что там лежит, не дам полное описание модели данных с описанием типов, вы не сможете правильно его интерпертировать.
30 апр 20, 08:18    [22125526]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5288
hVostt


Сравните с количеством примитивов в XML

3.2.1 string
3.2.2 boolean
3.2.3 decimal
3.2.4 float
3.2.5 double
3.2.6 duration
3.2.7 dateTime
3.2.8 time
3.2.9 date
3.2.10 gYearMonth
3.2.11 gYear
3.2.12 gMonthDay
3.2.13 gDay
3.2.14 gMonth
3.2.15 hexBinary
3.2.16 base64Binary
3.2.17 anyURI
3.2.18 QName
3.2.19 NOTATION

Т.е. XML может быть самодостаточен для передачи данных и типов данных. Плюс любое количество аннотаций.


Я знаю. Вот только этим всем пользоваться тот еще гемор. Тут кстати еще нет Any и AnyType ;-)

hVostt


JSON не может быть надёжнее, так как информацию о типе не хранит. Но проще, так как примитивов меньше. По сути основное преимущество JSON в простоте и меньшем количестве оверхеда.

Но это не забесплатно.


В этом и прелесть json. Там всего три типа.
И его всегда можно распарсить однозначно в "объект", "массив" или "строку".

Далее строку уже можно парсить как угодно, по каким угодно правилам.

Для передачи данных это более чем достаточно.

С xml/xsd всегда танцы с бубном связанные с xsd.

Одни и те же данные, с одними и теми же xsd в зависимости от используемого marshaller'а будут получаться разные xml. В отличии от json, где боле-менее будет одинаковый json.

По мне так xml/xsd это глюкавый оверхед.

Я пока не разбирался со схемами для json.
Но, например, HateOS смотрится в первом приближении довольно мило.
30 апр 20, 09:50    [22125552]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
Zzz79
Member

Откуда:
Сообщений: 168
hVostt
mayton
Несколько раз я ходил вокруг этого формата. И облизывался.

mayton
Вобщем докиньте свои 5 коп.


Так себе формат. Чудовищно переусложнён. В следствие этого, нормальной полной поддержки последней версии формата YAML толком нигде нет. И даже если вы её найдёте/реализуете, пользы от этого мало. Ибо применение всех фишечек приведёт к нечитаемости и неупотребимости.

YAML хорошо подходит именно для ручного использования, т.е. для конфигов.

Для передачи данных лучше использовать JSON/BSON/XML.

В общем, никакого профита, кроме как использования для конфига нет.

полностью поддерживаю.
ямл для конфигов хорош
а для хранения лучше json
xml уже устарел
30 апр 20, 09:50    [22125553]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5288
hVostt
mad_nazgul
Их комбинация позволяет передавать любые данные .


Можно передавать только вот это: объект, строка, массив, число, bool и null. Никакие другие данные передавать нельзя.


В Json по большому счету нету числа, bool и null. Это все строки.
JavaScript может сделать предположение, что то или иное значение является числом или bool. На там куча странных "умолчаний", которые надо просто знать типа
"true" == true


hVostt

Т.е. если я вам пришлю какой-нибудь JSON и не расскажу что там лежит, не дам полное описание модели данных с описанием типов, вы не сможете правильно его интерпертировать.


Согласен, т.к. JSON это schemaless.
И это хорошо. Как минимум он не дает иллюзии, что у вас есть точное описание протокола передачи данных.
Т.к. xsd это не точное описание, и для него иногда нужны хинты (xjb), которые подсказывают "как правильно" разбирать xsd.

С Json обычно, просто прошу прислать их модель (классы) которые мне посылают.
Обычно они довольно точно описывают, что ко мне прилетит в виде JSON.

С xsd приходилось еще просить парочку примеров на xml, чтобы понять, что мне реально прилетит из несколько интерпретаций xsd-схемы. :-)
30 апр 20, 10:00    [22125555]     Ответить | Цитировать Сообщить модератору
 Re: Семантика Yaml документа.  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5288
Zzz79

полностью поддерживаю.
ямл для конфигов хорош
а для хранения лучше json
xml уже устарел


Он не устарел.
"То что мертво умереть не может"
Просто xml во первых больше чем json при одинаковых данных.
Во вторых xsd это сложный язык описания метаинформации, который дает не однозначный результат.
Помню во времена хайпа soap java'исты отправляли лучи поноса в сторону MS и его подделий, за своеобразную интерпретацию стандартов SOAP.
30 апр 20, 10:04    [22125557]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Java Ответить