Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Как сконвертировать Java/Kotlin класс в YAML без аннотаций / 7 сообщений из 7, страница 1 из 1
13.08.2020, 13:17
    #39989327
private
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сконвертировать Java/Kotlin класс в YAML без аннотаций
Я попробовал это сделать со SnakeYAML но вместо данных он печатает `!!Portfolio {}`. Код

Код: java
1.
2.
3.
4.
5.
6.
    fun to_yaml(v: Any): String {
      val yaml = Yaml()
      val writer = StringWriter()
      yaml.dump(v, writer)
      return writer.toString()
    }



Как можно сделать чтобы он печатал обьект, любой обьект без нужды в аннотациях. Как JSON для JavaScript.
GSON от Гугла в JSON так конвертирует по умолчанию так как надо, но с YAML что-то не получается.

В идеале чтобы еще и обратно можно было распарсить, указав ему на корневой класс (тоже без аннотаций).

Ну и все внутренние классы тоже. Пример полного кода :


Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
    import org.yaml.snakeyaml.Yaml
    import java.io.StringWriter


    fun to_yaml(v: Any): String {
      val yaml = Yaml()
      val writer = StringWriter()
      yaml.dump(v, writer)
      return writer.toString()
    }

    
    fun main() {
    
      val portfolio = Portfolio(
        "id1",
        listOf(
          PortfolioPosition(
            1,
            1.0,
            PortfolioStockContract(
              "MSFT"
            )
          )
        )
      )
      println(to_yaml(portfolio))
    }
        
    class Portfolio(
      val account_id: String,
      val positions:  List<PortfolioPosition>
    )
    
    class PortfolioPosition (
      val position:     Int,
      val average_cost: Double,
      val contract:     PortfolioContract
    )
    
    interface PortfolioContract
    
    enum class ContractType { stock, option }
    
    class PortfolioStockContract (
      val symbol:   String
    ) : PortfolioContract {
      val type = ContractType.stock
    }
...
Рейтинг: 0 / 0
13.08.2020, 14:04
    #39989361
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сконвертировать Java/Kotlin класс в YAML без аннотаций
....отредактировано...сорян не туда
...
Рейтинг: 0 / 0
14.08.2020, 18:53
    #39989922
dakeiras
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сконвертировать Java/Kotlin класс в YAML без аннотаций
А чем Jackson databind не устроил?
...
Рейтинг: 0 / 0
15.08.2020, 08:30
    #39990012
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сконвертировать Java/Kotlin класс в YAML без аннотаций
private,

Непонятно что ты хочешь. Приведи пример желаемого документа на выходе.
...
Рейтинг: 0 / 0
15.08.2020, 11:52
    #39990022
private
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сконвертировать Java/Kotlin класс в YAML без аннотаций
Джексон не смотре, гляну, спасибо.

На выходе должна получиться структура (я записал ее как JSON на YAML так-же должно быть)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
{
  account_id: "id1",
  positions: []
    {
      position:     1,
      average_cost: 1.0,
      contract:     {
        symbol: "MSFT",
        type:   "stock"
      }
    }
  ]
}
...
Рейтинг: 0 / 0
15.08.2020, 14:08
    #39990034
dakeiras
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сконвертировать Java/Kotlin класс в YAML без аннотаций
Ok, тогда накидаю по Джексону:

ObjectMapperConfiguration:

Код: 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.
26.
27.
28.
/**
 * Taken from: https://blog.jdriven.com/2016/11/handling-yaml-format-rest-spring-boot/
 */
@Configuration
class ObjectMapperConfiguration {

    //This is our default JSON ObjectMapper. Add @Primary to inject is as default bean.
    @Bean
    @Primary
    ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper()
        //Enable or disable features
        objectMapper.enable(SerializationFeature.INDENT_OUTPUT)
        return objectMapper
    }

    @Bean
    ObjectMapper yamlObjectMapper() {
        //Enable or disable features
        YAMLFactory yamlFactory = new YAMLFactory()
        yamlFactory.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES)
        yamlFactory.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER)
        yamlFactory.disable(YAMLGenerator.Feature.SPLIT_LINES)
        yamlFactory.enable(YAMLGenerator.Feature.INDENT_ARRAYS)
        ObjectMapper yamlObjectMapper = new ObjectMapper(yamlFactory)
        return yamlObjectMapper
    }
}



либо вот так напрямую:


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator

    ObjectMapper objectMapper = new ObjectMapper(
            new YAMLFactory()
                    .enable(YAMLGenerator.Feature.MINIMIZE_QUOTES)
                    .disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER)
                    .disable(YAMLGenerator.Feature.SPLIT_LINES)
                    .enable(YAMLGenerator.Feature.INDENT_ARRAYS)
    )
...
Рейтинг: 0 / 0
18.08.2020, 21:07
    #39990610
private
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сконвертировать Java/Kotlin класс в YAML без аннотаций
Спасибо, работает!

Итоговый код

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
fun to_yaml(v: Any): String {
  val mapper = ObjectMapper(
  YAMLFactory()
    .enable(YAMLGenerator.Feature.MINIMIZE_QUOTES)
    .disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER)
    .disable(YAMLGenerator.Feature.SPLIT_LINES)
    // .enable(YAMLGenerator.Feature.INDENT_ARRAYS)
  )
  mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
  return mapper.writeValueAsString(v)
}



Печатает

Код: java
1.
2.
3.
4.
5.
6.
7.
account_id: id1
positions:
- position: 1
  average_cost: 1.0
  contract:
    type: stock
    symbol: MSFT
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как сконвертировать Java/Kotlin класс в YAML без аннотаций / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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