2017-03-09 4 views
0

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!

Répondre

0

Peut-être que vous pourriez écrire cette chaîne JSON premier qui l'envelopper dans un objet puis en lire cette nouvelle Json

Toutes mes excuses J'ai mal lu votre question et je l'ai depuis essayé de résoudre votre problème sans succès. J'ai ce qui suit qui travaille sur la sérialisation mais pas sur la désérialisation. Peut-être que cela vous aidera plus loin.

@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; 
    } 
} 
+0

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 ... –