我一直在尝试使用typesafe配置来解析来自Web服务的数组结构JSON响应,并得到一个异常,即config在文件根目录中具有类型LIST而不是object:
com.typesafe.config.ConfigException$WrongType: Reader: 1: has type LIST rather than object at file root
at com.typesafe.config.impl.Parseable.forceParsedToObject(Parseable.java:136)
at com.typesafe.config.impl.Parseable.parse(Parseable.java:299)
at com.typesafe.config.ConfigFactory.parseReader(ConfigFactory.java:622)
at com.typesafe.config.ConfigFactory.parseReader(ConfigFactory.java:636)
```
很难相信typeafe配置无法解析这种结构的JSON,所以我假设我做错了什么,因此需要你的建议如何处理这个问题......
上下文 - 编写javaagent并需要
我想到的选项是:
a)将整个响应读入内存(由于可能是长字符串/字节数组而导致错误)并用一些fakeRoot
元素作为前缀,然后解析它或者
b)弄乱ConfigDocumentParser
以提取[
和]
braket节点之间的节点列表,然后以某种方式构造Config
对于我来说,(a)和(b)看起来太过于hacky(除了效率低下),所以我想知道它是否真的是Config解析器的限制?
这是测试代码,它可能有助于解释我最终想要的东西:
@Test
public void config_howCouldItParseArray() {
String webServiceResponse = "[{'element':'value'}]".replace("'","\"");
// goal is to read data in streaming fashion from the response entity stream
// StringReader is for illustration only
Reader responseInputStreamReader = new StringReader(webServiceResponse);
Config config = ConfigFactory.parseReader(responseInputStreamReader);
Assert.assertEquals(config.getConfigList(".").size(),1);
}
我很感激任何建议或选择,
提前致谢!
答案 0 :(得分:1)
也许你可以先把那个字符串写成json,然后把它包装成一个对象,然后读回那个新的Json
道歉我误解了你的问题,我已经尝试解决你的问题而没有成功。我有以下内容适用于序列化但不反序列化。也许它会对你有所帮助。
@Test
public void NoRootTest() throws Exception {
ObjectMapper mapper = new ObjectMapper();
TestClass[] test1 = new TestClass[1];
test1[0] = new TestClass();
test1[0].setElement("value");
String string = mapper.writeValueAsString(test1);
TestClass[] testClasses = mapper.readValue(string, TestClass[].class);
}
public class TestClass {
private String element;
public TestClass() {
}
public String getElement() {
return element;
}
public void setElement(final String element) {
this.element = element;
}
}