我有一个简单的RDF文件,想将其转换为漂亮的嵌套JSON。
:b0 a <http://schema.org/Book> ;
<http://schema.org/name> "Semantic Web Primer (First Edition)" ;
<http://schema.org/offers> _:b1 ;
<http://schema.org/publisher> "Linked Data Tools" .
_:b1 a <http://schema.org/Offer> ;
<http://schema.org/price> "2.95" ;
<http://schema.org/priceCurrency> "USD" .
应该成为
{
"type" : "Book",
"name" : "Semantic Web Primer (First Edition)",
"offers" : {
"type" : "Offer",
"price" : "2.95",
"priceCurrency" : "USD"
},
"publisher" : "Linked Data Tools"
}
参考方案
使用框架
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.rdf4j.model.Statement;
import org.eclipse.rdf4j.rio.RDFFormat;
import org.eclipse.rdf4j.rio.RDFHandlerException;
import org.eclipse.rdf4j.rio.RDFParser;
import org.eclipse.rdf4j.rio.RDFWriter;
import org.eclipse.rdf4j.rio.Rio;
import org.eclipse.rdf4j.rio.helpers.StatementCollector;
import org.junit.Test;
import com.github.jsonldjava.core.JsonLdOptions;
import com.github.jsonldjava.core.JsonLdProcessor;
import com.github.jsonldjava.utils.JsonUtils;
import com.google.common.base.Charsets;
public class HowToConvertRdfToJson {
@Test
public void convertRdfToPrettyJson(){
try(InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("book.ttl")){
System.out.println(getPrettyJsonLdString(in,RDFFormat.TURTLE));
}catch(Exception e){
throw new RuntimeException(e);
}
}
/**
* @param in Input stream with rdf data
* @param format format of the rdf data
* @return a pretty JSON document as String
*/
public static String getPrettyJsonLdString(InputStream in, RDFFormat format) {
return getPrettyJsonLdString(
readRdfToString(in, format, RDFFormat.JSONLD, ""));
}
/**
* @param statements rdf statements collected
* @return a pretty JSON document as String
*/
public static String getPrettyJsonLdString(Collection<Statement> statements) {
return getPrettyJsonLdString(
graphToString(statements, RDFFormat.JSONLD));
}
private static String getPrettyJsonLdString(String rdfGraphAsJson) {
try {
//@formatter:off
return JsonUtils
.toPrettyString(
removeGraphArray(
getFramedJson(
createJsonObject(
rdfGraphAsJson))));
//@formatter:on
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static Map<String, Object> removeGraphArray(Map<String, Object> framedJson) {
List<Map<String,Object>> graph = (List<Map<String, Object>>) framedJson.get("@graph");
return graph.get(0);
}
private static Map<String, Object> getFramedJson(Object json) {
try {
return JsonLdProcessor.frame(json, getFrame(), new JsonLdOptions());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static Map<String, Object> getFrame() {
Map<String, Object> context = new HashMap<>();
context.put("@context", "http://schema.org/");
return context;
}
private static Object createJsonObject(String ld) {
try (InputStream inputStream =
new ByteArrayInputStream(ld.getBytes(Charsets.UTF_8))) {
Object jsonObject = JsonUtils.fromInputStream(inputStream);
return jsonObject;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static Collection<Statement> readRdfToGraph(
final InputStream inputStream, final RDFFormat inf,
final String baseUrl) {
try {
final RDFParser rdfParser = Rio.createParser(inf);
final StatementCollector collector = new StatementCollector();
rdfParser.setRDFHandler(collector);
rdfParser.parse(inputStream, baseUrl);
return collector.getStatements();
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
public static String readRdfToString(InputStream in, RDFFormat inf,
RDFFormat outf, String baseUrl) {
Collection<Statement> myGraph = null;
myGraph = readRdfToGraph(in, inf, baseUrl);
return graphToString(myGraph, outf);
}
public static String graphToString(Collection<Statement> myGraph,
RDFFormat outf) {
StringWriter out = new StringWriter();
RDFWriter writer = Rio.createWriter(outf, out);
try {
writer.startRDF();
for (Statement st : myGraph) {
writer.handleStatement(st);
}
writer.endRDF();
} catch (RDFHandlerException e) {
throw new RuntimeException(e);
}
return out.getBuffer().toString();
}
}
版画
{
"id" : "_:b0",
"type" : "Book",
"name" : "Semantic Web Primer (First Edition)",
"offers" : {
"id" : "_:b1",
"type" : "Offer",
"price" : "2.95",
"priceCurrency" : "USD"
},
"publisher" : "Linked Data Tools"
}
带绒球
<dependency>
<groupId>org.eclipse.rdf4j</groupId>
<artifactId>rdf4j-runtime</artifactId>
<version>2.2</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.github.jsonld-java</groupId>
<artifactId>jsonld-java</artifactId>
<version>0.10.0</version>
</dependency>
SOAPFaultException部署在Tomcat上时,但在GlassFish中工作正常 - java朋友们,我一直在尝试很多,阅读了很多论坛,但无法理解为什么出现此问题。我使用契约优先方法创建了一个Jax-WS WebService。创建WSDL和XSD,然后使用wsimport工具生成其余工件,为SEI提供实现。将WebService应用程序部署到Eclipse Helios中的GlassFish(Glassfish适配器和Eclipse中安装的插件)。…
Java Applet的URLConnection与PHP无效 - java我已经研究了Oracle文档和示例,但仍然无法正常工作。我有一个Java Applet,它只是尝试使用URLConnection和OutputStreamWriter通过POST将文本字段发送到PHP脚本。 Java方面似乎工作正常,没有引发异常,但是PHP在我的页面上未显示任何输出。我是PHP新手,因此请耐心等待。这是相关的Java部分: try { UR…
菱形运算符<>是否等于<?> - java我在util.TreeSet类中发现,其中一个构造函数正在使用具有空泛型类型的新TreeMap调用另一个构造函数。 public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); } new TreeMap<>是什么意思…
页面加载而不是提交时发生struts验证 - java请原谅我;我对Struts有点陌生。我遇到一个问题,即页面加载而不是我实际提交表单时发生了验证。我整天都在论坛上搜寻和搜寻,没有任何运气。我显然做错了一些事情,应该很容易确定,但是我还没有发现问题所在。这是我的struts.xml的片段:<action name="*Test" method="{1}" clas…
Java中的<<或>>>是什么意思? - javaThis question already has answers here: Closed 7 years ago. Possible Duplicate: What does >> and >>> mean in Java?我在一些Java代码中遇到了一些陌生的符号,尽管代码可以正确编译和运行,但对于括号在此代码中的作用却感…