2017-08-14 2 views
0

J'utilise EMFJson pour sérialiser les modèles EMF Ecore. Je suis capable de créer une chaîne JSON à partir d'un modèle existant. Cependant, le chemin du retour ne fonctionne pas pour moi. J'ai essayé les deux extraits suivants:Lecture d'une chaîne JSON à l'aide de EMFJson

Première tentative:

ObjectMapper objectMapper = EMFModule.setupDefaultMapper(); 
objectMapper.reader().forType(MyClass.class).readValue(string); 

Deuxième tentative:

ObjectMapper objectMapper = EMFModule.setupDefaultMapper(); 

    ResourceSet resourceSet = new ResourceSetImpl(); 
    resourceSet.getResourceFactoryRegistry() 
        .getExtensionToFactoryMap() 
        .put("json", new JsonResourceFactory()); 
try { 
    Resource resource = objectMapper 
     .reader() 
     .withAttribute(EMFContext.Attributes.RESOURCE_SET, resourceSet) 
     .withAttribute(EMFContext.Attributes.RESOURCE_URI, null) 
     .forType(Resource.class) 
     .readValue(string); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

Pour les deux tentatives que je reçois l'exception suivante: java.lang.RuntimeException: Impossible de créer ressource pour uri par défaut

Je suppose que la deuxième approche ne peut pas fonctionner du tout car je ne sais pas quoi fournir comme RESOURCE_URI. L'exemple here J'ai pris comme base pour la tentative deux lit un fichier plutôt qu'une chaîne. Est-ce que quelqu'un a une idée de comment faire ce travail? Merci!

Répondre

0

j'ai réussi à le manipuler en utilisant la réponse donnée ici: Parse XML in string format using EMF

La méthode avec mes changements ressemble à ceci:

private EObject loadEObjectFromString(String model, EPackage ePackage) throws IOException { 
    ResourceSet resourceSet = new ResourceSetImpl(); 
    resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION, new JsonResourceFactory()); 

    resourceSet.getPackageRegistry().put(ePackage.getNsURI(), ePackage); 
    Resource resource = resourceSet.createResource(URI.createURI("*.extension")); 
    InputStream stream = new ByteArrayInputStream(model.getBytes(StandardCharsets.UTF_8)); 
    resource.load(stream, null); 

    return resource.getContents().get(0); 
} 

Maintenant, je peux l'appeler comme ceci:

EObject test = this.loadEObjectFromString(jsonString, MyPackage.eINSTANCE);