如何使用typesafe配置解析JSON数组?

时间:2017-03-09 18:27:49

标签: java json parsing config typesafe

我一直在尝试使用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并需要

  • 点符号支持和
  • 最小的依赖关系 - 代理正在使用HOCON编写的配置,所以除非使用typesafe配置真的不可能,否则我宁愿不使用另一个json解析器

我想到的选项是:

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);
}

我很感激任何建议或选择,

提前致谢!

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;
    }
}