如何将 groovy 表示转储到 YAML 并避免使用未标记的节点?

Posted

技术标签:

【中文标题】如何将 groovy 表示转储到 YAML 并避免使用未标记的节点?【英文标题】:How do I dump a groovy representation to YAML and avoid having untagged nodes? 【发布时间】:2012-05-10 20:59:50 【问题描述】:

我想将以下结构转储到 YAML 文件中:

public class TestSuite 
    String name
    List testCases = []

测试用例列表在哪里这个类:

class TestCase 
    String name
    String id

我希望它看起来像这样:

name: Carrier Handling and Traffic
testCases:
- name: Call setup by UE
  id: DCM00000001

但它最终看起来像这样:

name: Carrier Handling and Traffic
testCases:
- !!com.package.path.TestCase
  name: Call setup by UE
  id: DCM00000001

我想这与 List 不是标记数据结构这一事实有关,但我不知道如何获得测试用例的名称来表示对象。提示?

【问题讨论】:

【参考方案1】:

是否将TestSuite 定义为:

public class TestSuite 
    String name
    List<TestCase> testCases = []

让你更接近你想要的结果?虽然我自己没有使用过 SnakeYaml...


编辑

有一些空闲时间,想出了这个独立的测试脚本:

@Grab( 'org.yaml:snakeyaml:1.10' )
import org.yaml.snakeyaml.Yaml
import org.yaml.snakeyaml.representer.Representer
import java.beans.IntrospectionException
import org.yaml.snakeyaml.introspector.Property

public class TestSuite 
    String name
    List<TestCase> testCases = []


class TestCase 
    String name
    String id


class NonMetaClassRepresenter extends Representer 
  protected Set<Property> getProperties( Class<? extends Object> type ) throws IntrospectionException 
    super.getProperties( type ).findAll  it.name != 'metaClass' 
  


TestSuite suite = new TestSuite( name:'Carrier Handling and Traffic' )
suite.testCases << new TestCase( name:'Call setup by UE', id:'DCM00000001' ) 

println new Yaml( new NonMetaClassRepresenter() ).dumpAsMap( suite )

哪些打印:

name: Carrier Handling and Traffic
testCases:
- id: DCM00000001
  name: Call setup by UE

【讨论】:

嗯,我真的不明白这里发生了什么。您覆盖了默认的表示器以不输出元类的名称?没有更简单的方法吗? 不是我能找到的......你能发布你如何输出你在问题中显示的yaml吗?正如我所说,我并没有真正使用过snakeyaml 我只是直接将其转储而不使用 Representer。我宁愿认为我误解了 YAML 本身的某些内容,但我似乎无法完全理解标准,以理解为什么它最终看起来像那样。 @Fylke 看起来像snakeyaml 将fully qualified type 放入其中,以便在反序列化 YAML 文件时将其转换回其原始类型......我不得不使用自定义 Representer 作为所有 Groovy 对象有一个元类,在我的测试中,它也被放入了 YAML(所以我的 NonMetaClassRepresenter 将其过滤掉) 啊,现在我开始明白了。所以这就是为什么当我只使用常规的字符串列表而不是自定义的 Groovy 类时它“有效”的原因。那么您的解决方案听起来是唯一明智的选择,谢谢!

以上是关于如何将 groovy 表示转储到 YAML 并避免使用未标记的节点?的主要内容,如果未能解决你的问题,请参考以下文章

Python - 字典到 YAML 转储 - YAML 不扩展有序字典?

YAML - 转储没有类型/标签的嵌套对象

如何将带有前导零的数字字符串转储为 yaml-cpp 中的有效 yaml 字符串?

转储到另一个文件时如何删除引号?

通过 ruamel.yaml 转储时如何在 yaml 文件中保留空值

如何使用显式引用转储 YAML?