【问题标题】:Error when parsing Yaml file - Cannot create property for JavaBean解析 Yaml 文件时出错 - 无法为 JavaBean 创建属性
【发布时间】:2019-06-21 21:08:33
【问题描述】:

Yaml 文件包含:

test:
  subHeading: "1234"

Model.java

class Model{
  @JsonProperty("test")
  private SubHeading subHead;

  private class SubHeading{
     @JsonProperty("subHeading")
      private String text;
  }

我尝试解析以上Yaml内容如下:

Yaml yaml = new Yaml(new Constructor(Model.class));
System.out.println(yaml.load(new FileReader(PATH)).toString());

我立即得到一个异常:

Cannot create property=test for JavaBean=Model@13a5fe33
 in 'reader', line 1, column 1:
    test:

知道我做错了什么以及我可以在这里改变什么吗?

【问题讨论】:

    标签: java jackson yaml snakeyaml


    【解决方案1】:

    您首先使用Jackson 注释但SnakeYaml 库来读取yaml 文件。您必须通过以下方式简化您的解决方案:

    1. 简化模型
    2. 使用Jackson
    3. 在属性与注释中的值同名的情况下删除 Jackson 注释。

    型号
    在新文件中将每个类创建为public class

    public class Model {
    
        private SubHeading test;
    
        public SubHeading getTest() {
            return test;
        }
    
        public void setTest(SubHeading test) {
            this.test = test;
        }
    
        @Override
        public String toString() {
            return "Model{" +
                    "test=" + test +
                    '}';
        }
    }
    

    public class SubHeading {
        private String subHeading;
    
        public String getSubHeading() {
            return subHeading;
        }
    
        public void setSubHeading(String subHeading) {
            this.subHeading = subHeading;
        }
    
        @Override
        public String toString() {
            return "SubHeading{" +
                    "subHeading='" + subHeading + '\'' +
                    '}';
        }
    }
    

    示例用法:

    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
    
    public class YamlTest {
    
        public static void main(String[] args) throws Exception {
            ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
            mapper.enable(SerializationFeature.INDENT_OUTPUT);
    
            String text = "test:\n" +
                    "  subHeading: \"1234\"";
    
            Model model = mapper.readValue(text, Model.class);
            System.out.println(model);
        }
    }
    

    上图:

    Model{test=SubHeading{subHeading='1234'}}
    

    【讨论】:

      猜你喜欢
      • 2018-06-23
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 2011-08-28
      • 2013-08-18
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多