【问题标题】:How to load a java.util.Set with snakeYAML如何使用 snakeYAML 加载 java.util.Set
【发布时间】:2012-02-12 11:02:14
【问题描述】:

我尝试加载以下 yaml 序列:

- Person(paul):
firstName: Paul
lastName: Lumbergh
children :
    - Person(bill)
    - Person(jane)

我试图在以下 bean 中加载:

public class Person {

private long id;
private String firstName;
private String lastName;
private Person father;
private Set<Person> children;
}

我收到此错误是因为snakeYaml 将我的序列加载到 java.util.List 而不是 java.util.Set 中。

这是一种强制snakeYAML 在java.util.Set 中加载序列的方法吗?

org.yaml.snakeyaml.error.YAMLException: org.yaml.snakeyaml.error.YAMLException: Cannot set property='children' with value='[Person [firstName=Bill, secondName=Lumbergh], Person [firstName=Jane, secondName=Lumbergh]]' (class java.util.ArrayList) in Person [firstName=Paul, secondName=Lumbergh]
at org.yaml.snakeyaml.extensions.compactnotation.CompactConstructor$ConstructCompactObject.construct(CompactConstructor.java:163)
at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:183)
at org.yaml.snakeyaml.constructor.BaseConstructor.constructSequenceStep2(BaseConstructor.java:277)
at org.yaml.snakeyaml.constructor.BaseConstructor.constructSequence(BaseConstructor.java:248)
at org.yaml.snakeyaml.constructor.SafeConstructor$ConstructYamlSeq.construct(SafeConstructor.java:440)
at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:183)
at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:142)
at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:128)
at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:480)
at org.yaml.snakeyaml.Yaml.load(Yaml.java:411)
at com.pearson.fixy.Fixy.loadEntities(Fixy.java:105)
at com.pearson.fixy.Fixy.load(Fixy.java:126)
at com.dvidea.TestFixy.test(TestFixy.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

【问题讨论】:

  • 是的,我有一个带有 java.util.Set 的 bean
  • 你可以发布你正在尝试的相关代码吗?
  • 你能让 YAML 使用 !!set 类型吗?
  • 更好的是,有什么理由为什么属性必须是Set而不是Collection?这样它就可以同时接受列表和集合。
  • 你为什么明确需要Set

标签: java set yaml snakeyaml


【解决方案1】:

根据 yaml specification 设置语法如下:

- Person(paul): 
  firstName: Paul 
  lastName: Lumbergh 
  children : !!set ? Person(bill) ? Person(jane) – 

【讨论】:

  • 这真的有效吗?该链接是 10 年前最后一次更新的工作草案。
【解决方案2】:

你强制 SnakeYAML 使用 List 而不是 Set。集合在 YAML 中有不同的表示形式:http://yaml.org/type/set.html

您可以更改 YAML 文档或指示 SnakeYAML 使用集合而不是列表。 你可能需要看in tests

【讨论】:

    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2014-09-16
    • 2013-02-08
    相关资源
    最近更新 更多