使用EMFJson读取JSON字符串
问题描述:
我使用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我以两次读取文件而不是字符串为基础。有人有一个想法如何使这项工作?谢谢!
答
我设法利用这里给出的答案来处理它: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);