【问题标题】:List in property file is deserialized to String using Jackson使用 Jackson 将属性文件中的列表反序列化为字符串
【发布时间】:2018-02-20 14:27:55
【问题描述】:

在我们的应用程序中,我们尝试使用 Jackson 读取平面属性文件,以将属性与我们的 POJO 匹配。属性文件包含一个列表,但似乎已反序列化为单个字符串。 这是我得到的错误:“Cannot deserialize instance of java.util.ArrayList out of VALUE_STRING token

这是输入文件的样子

test=Just a test 
status=A, B, C

也试过了

status=[A, B, C]
status=["A", "B", "C"]

这是我们的 POJO

@JsonIgnoreProperties(ignoreUnknown = true)
public class BasicPOJO {

  @JsonProperty("status")
  List<String> status;

  @JsonProperty("test")
  String test;

 //Getter and setter ..
}

这就是我们的映射方式

public void test1() {
// Read configuration file from classpath
InputStream in = WMSApplicationProperties.class.getClassLoader()
    .getResourceAsStream("application.properties");

LOGGER.debug("Reading with JSON layout");
JavaPropsMapper mapper = new JavaPropsMapper();


try {
  JavaPropsSchema schema = JavaPropsSchema.emptySchema()
      .withoutPathSeparator();

  BasicPOJO myProperties = mapper.readerFor(BasicPOJO.class)
      .with(schema)
      .readValue(in);      
  } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
  }
}

知道为什么列表被视为字符串 任何帮助将不胜感激

【问题讨论】:

  • 您的 JSON 属性文件应如下所示:{ "status" : [ "A", "B", "C" ] }
  • 它不是 JSON 属性文件,它是一个经典的属性文件(不幸的是我无法更改)。所以格式是property=value
  • 如果是这样,您的BasicPOJO 将不起作用。您的 status 属性应该包含 JSON 对象还是仅包含列表?
  • 我的 status 属性应该包含一个逗号分隔值的列表,我希望它在反序列化时会被转换为一个列表
  • 你为什么不使用基本的String split(...) 来代替?您显然不为此使用 JSON 解析器。

标签: java json jackson2


【解决方案1】:

看起来在读取属性文件(非 JSON 格式)时指定列表的唯一方法是指定如下属性:

status.1=A
status.2=B
status.3=C

不幸的是格式:status=A, B, C 是不可能的

【讨论】:

    猜你喜欢
    • 2020-05-20
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多