J'ai essayé d'utiliser typesafe config pour analyser la réponse JSON structurée tableau à partir d'un service Web et a obtenu une exception config est de type LIST plutôt que l'objet à une racine de fichier:Comment analyser un tableau JSON en utilisant typesafe config?
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)
`` `
Il est vraiment difficile de croire que config typesafe incapable d'analyser JSON de cette structure, donc je suppose que je fais quelque chose de mal, donc besoin de vos conseils comment aborder ce problème ...
Contexte - la rédaction d'un javaagent et besoin
- support de notation de points et
- minimum de dépendances - agent utilise configs écrit en HOCON déjà, à moins qu'il est vraiment impossible de le faire avec typesafe config, je préfère ne pas utiliser un autre analyseur JSON
options je pensais sont:
a) pour lire la réponse entière en mémoire (mauvaise en raison de chaînes potentiellement longues/tableaux d'octets) et le préfixe par un élément fakeRoot
, puis l'analyser OU
b) au mess avec ConfigDocumentParser
pour extraire la liste des noeuds entre [
et ]
nœuds de braket THEN Config
de ceux qui en quelque sorte
deux (a) et (b) chercher trop hacky dans le but (en plus d'être inefficace) à moi, donc je me demande est-ce vraiment une limitation de Config parser?
est ici le code de test qui pourrait aider à expliquer ce que je veux à la fin:
@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);
}
Je vous remercie des conseils ou de l'option pour aller avec,
Merci à l'avance!
Malheureusement je ne peux pas le faire - ce tableau JSON est une réponse du service au-delà de mon contrôle, et, si je comprends bien votre suggestion, je dois lire toute la réponse en mémoire, préfixe avec un fakeroot et ensuite analyser. C'est fondamentalement l'option (a) que j'ai énumérée ci-dessus, qui a un inconvénient d'usage excessif de mémoire (comparé à la lecture des données directement d'un flux ou de la réponse). J'aimerais pouvoir me le permettre ... –