2017-08-14 86 views
0

我使用EMFJson來序列化EMF Ecore模型。我能夠從現有的模型創建一個JSON字符串。然而,回來的路不適合我。我想下面的兩個片段:使用EMFJson讀取JSON字符串

第一次嘗試:

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

第二次嘗試:

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

對於這兩種嘗試,我收到以下異常:了java.lang.RuntimeException:無法創建uri默認的資源

我想第二種方法根本無法工作,因爲我不知道該怎麼提供作爲RESOURCE_URI。示例here我以兩次讀取文件而不是字符串爲基礎。有人有一個想法如何使這項工作?謝謝!

回答

0

我設法利用這裏給出的答案來處理它:Parse XML in string format using EMF

的方法與我的變化是這樣的:

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

現在,我可以這樣調用:

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