Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Семантика Yaml документа. / 25 сообщений из 94, страница 1 из 4
29.04.2020, 11:52
    #39952771
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
Несколько раз я ходил вокруг этого формата. И облизывался. Я позиционировал его
как замену Excel в бизнес - коммуникациях. Хотелось уйти от передачи маппингов
в Excel к маппингу в csv/json/yaml. Последний стоял как десерт. Но к сожалению
мне самому надо было понять подводные камни. А именно.

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

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

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

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

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

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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 коп.
...
Рейтинг: 0 / 0
29.04.2020, 12:16
    #39952789
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
mayton
замену Excel в бизнес - коммуникациях

по моим наблюдениям excel это единственный формат, который понимает большинство эникейщиков и замены ему не предвидится, какими бы чудесными не были другие форматы. даже когда просишь сохранить в csv из того же excel, половина не понимает чего от них хотят.
...
Рейтинг: 0 / 0
29.04.2020, 12:31
    #39952793
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
mayton,

А как же старый добрый key-value properties :-)
...
Рейтинг: 0 / 0
29.04.2020, 12:32
    #39952795
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
Я уже много лет подковёрно веду борьбу с Excel. Я выкашиваю его косой и вырубаю топором
из проектов там где есть возможность. И у меня на то есть своя аргументация. Но топик не об этом.

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

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

И от yaml нас отделяет только несколько брейнштормов и грумингов идей.
...
Рейтинг: 0 / 0
29.04.2020, 13:56
    #39952844
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
Если развернуть этот документ в дерево LinkedHashMap то вот такое получается.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    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}]



Прикольно что дата распозналась именно как дата.
...
Рейтинг: 0 / 0
29.04.2020, 13:58
    #39952846
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    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);
    }
...
Рейтинг: 0 / 0
29.04.2020, 15:18
    #39952885
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
Попробовал посериализировать. Стили стали более унылые и плоские.
Кто знает как управлять? Например я не хочу видеть JSon-like форматирование а
хочу такое с bullets как в исходном документе. (в моём первом посту)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
    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);

    }


Код: python
1.
2.
3.
4.
5.
6.
7.
8.
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}
...
Рейтинг: 0 / 0
29.04.2020, 15:47
    #39952903
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
mayton
как вы применяете этот формат на производтсве?

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

В DevOps скриптах деплоймента, мониторинга и т.п.
...
Рейтинг: 0 / 0
29.04.2020, 15:52
    #39952904
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
Нет. Девопс меня не интересует.

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

Всё что угодно кроме конфигов.
...
Рейтинг: 0 / 0
29.04.2020, 18:23
    #39952991
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
Управление типизацией (snakeyaml).

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

In:
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
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:
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
person:
  name: Mike
  occupation: programmer
  age: 23
  gpa: 3.5
  fav_num: 1.0E10
  male: true
  birthday: 1954-01-02T16:44:00Z
...
Рейтинг: 0 / 0
29.04.2020, 18:32
    #39952996
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
А вот еще интереснее. Алиасы. У Майка есть брат-близнец Том. Я задаю его дату-рождения через алиасы.

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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.
...
Рейтинг: 0 / 0
29.04.2020, 18:38
    #39952998
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
Есть еще динамическое переопределение алиасов и merge структур. Но мне пока хватит фич. Остановлюсь на этом.
...
Рейтинг: 0 / 0
29.04.2020, 19:52
    #39953051
Valentin Kolesnikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
mayton
Несколько раз я ходил вокруг этого формата. И облизывался. Я позиционировал его
как замену Excel в бизнес - коммуникациях. Хотелось уйти от передачи маппингов
в Excel к маппингу в csv/json/yaml. Последний стоял как десерт. Но к сожалению
мне самому надо было понять подводные камни. А именно.

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

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

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

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

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

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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 кодом.

Хорошего вам дня!
...
Рейтинг: 0 / 0
29.04.2020, 19:53
    #39953054
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
Valentin Kolesnikov, спасибо. Посмотрю.
...
Рейтинг: 0 / 0
29.04.2020, 20:03
    #39953057
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
У меня щас другая проблема. Я пробую продуктовые данные по бизнес-аналитике сохранять в Yaml.
(раньше мы в Json хранили) и вот это горизональное-вертикальное форматирование коллекций
- сильно мешает.

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

Вот это - неправильно.
Код: java
1.
2.
3.
4.
5.
6.
hobbies:
    - movies
    - bike
    - hacking
    - singing
  movies: ["Star Wars", "Dark Knigth"]



И я пока не вижу выхода как делать кастомный сериализатор. Хотя не хочу.
...
Рейтинг: 0 / 0
29.04.2020, 20:17
    #39953062
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
mayton
Нет. Девопс меня не интересует.

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

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

Для этого используем Json и XML
...
Рейтинг: 0 / 0
30.04.2020, 06:55
    #39953153
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
mayton
Несколько раз я ходил вокруг этого формата. И облизывался.

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


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

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

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

В общем, никакого профита, кроме как использования для конфига нет.
...
Рейтинг: 0 / 0
30.04.2020, 07:00
    #39953154
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
mayton
Расскажите о НЕСТАНДАРТНОМ использовании Yaml.
Меня интересует когда Yaml участвует в описании моделей данных.
Энтитей. ДТО. ОРМ-маппинга.


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

Что-то подобное делать в JSON/YAML -- это будут очередные кривые костыли, основанные на кривых соглашениях. Да и вообще, нафиг оно там не упёрлось.
...
Рейтинг: 0 / 0
30.04.2020, 07:57
    #39953159
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
hVostt
Для описания моделей данных и типизированного хранения данных всё же лучше XML ничего нет.
Так как в XML можно указывать тип данных и любые другие мета-данные, которые ложатся как влитые.


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

В этом плане json проще и надежнее.
Три типа - объект, массив, строка.
Их комбинация позволяет передавать любые данные .
Но в нём проблемы с датами.
...
Рейтинг: 0 / 0
30.04.2020, 08:14
    #39953160
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
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 в простоте и меньшем количестве оверхеда.

Но это не забесплатно.
...
Рейтинг: 0 / 0
30.04.2020, 08:18
    #39953161
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
mad_nazgul
Их комбинация позволяет передавать любые данные .


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

Т.е. если я вам пришлю какой-нибудь JSON и не расскажу что там лежит, не дам полное описание модели данных с описанием типов, вы не сможете правильно его интерпертировать.
...
Рейтинг: 0 / 0
30.04.2020, 09:50
    #39953182
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
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 смотрится в первом приближении довольно мило.
...
Рейтинг: 0 / 0
30.04.2020, 10:00
    #39953183
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
hVostt
mad_nazgul
Их комбинация позволяет передавать любые данные .


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


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



hVostt

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


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

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

С xsd приходилось еще просить парочку примеров на xml, чтобы понять, что мне реально прилетит из несколько интерпретаций xsd-схемы. :-)
...
Рейтинг: 0 / 0
30.04.2020, 10:04
    #39953185
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
Zzz79

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


Он не устарел.
"То что мертво умереть не может"
Просто xml во первых больше чем json при одинаковых данных.
Во вторых xsd это сложный язык описания метаинформации, который дает не однозначный результат.
Помню во времена хайпа soap java'исты отправляли лучи поноса в сторону MS и его подделий, за своеобразную интерпретацию стандартов SOAP.
...
Рейтинг: 0 / 0
30.04.2020, 10:31
    #39953189
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Семантика Yaml документа.
XML - это совершенно зрелая и завершенная технология. С большим количеством уровней абстракций.
Прям как стек TCP. На базе нее можно построить все что угодно. К сожалению у нее есть один недостаток.

Она - не human readable. Об этом можно сказать просто посмотрев на форматы офисных документов
через текстовый редактор.

Я-же искал технологию которая позволяет людям "от бизнеса" описывать метадатау в псевдо-текстовом
формате. И далее мы можем такие документы обсуждать. Делать правки прямо в git И затаскивать в проект
в этом первоисходном виде.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Семантика Yaml документа. / 25 сообщений из 94, страница 1 из 4
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]