Pau*_*lor 5 java json jaxb jersey
我使用JAXB创建的数据模型,我可以直接生成XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\
<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#" xmlns:ext="http://musicbrainz.org/ns/ext#-2.0">
<artist-list offset="0" count="1">
<artist ext:score="100" type="Group" id="4302e264-1cf0-4d1f-aca7-2a6f89e34b36">
<name>Farming Incident</name>
<ipi-list>
<ipi>1001</ipi>
</ipi-list>
</artist>
</artist-list>
</metadata>
Run Code Online (Sandbox Code Playgroud)
并且在Jersey的帮助下也使用Natural表示法生成JSon
"artist-list":
{"offset":0,
"count":1,
"artist":[
{"score":"100",
"type":"Group",
"id":"4302e264-1cf0-4d1faca7-2a6f89e34b36",
"name":"Farming Incident",
"ipi-list":
{
"ipi":[
"1001"
]
}
}]
}
Run Code Online (Sandbox Code Playgroud)
Xml很好,json几乎没有问题,因为Json直接支持具有像ipi-list和artist-list这样的元素的数组似乎不是json,是否有可能从我的模型生成更多类似json的json?
请求 的附加信息 json是使用JAXB和Jersey 从这个MMD模式http://svn.musicbrainz.org/mmd-schema/trunk/brainz-mmd2-jaxb/src/main/resources/musicbrainz_mmd-2.0.xsd生成的 ,请参阅 http://svn.musicbrainz.org/search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ResultsWriter.java和 http://svn.musicbrainz.org/search_server/trunk /servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ArtistWriter.java
关键是我希望能够从一个模式生成Json和XML,但是显然Json看起来不对,所以我正在寻找一种方法来改进它(我真的没有任何经验我自己)
注意: 我是EclipseLink JAXB (MOXy) 的负责人,也是JAXB (JSR-222)专家组的成员。
您可以利用 EclipseLink JAXB (MOXy) 中的 JSON 绑定和外部映射文档来支持您的用例。
外部映射文件 (oxml.xml)
您可以使用@XmlPath(".")MOXy 中的扩展来展平对象模型的某些部分。指定路径"."告诉 MOXy 将引用的对象包含在父节点中。
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum10699038">
<java-types>
<java-type name="Metadata">
<java-attributes>
<xml-element java-attribute="artistList" xml-path="."/>
</java-attributes>
</java-type>
<java-type name="Artist">
<java-attributes>
<xml-element java-attribute="ipiList" xml-path="."/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
Run Code Online (Sandbox Code Playgroud)
jaxb.属性
要将 MOXy 指定为您的 JAXB 提供程序,您需要添加一个jaxb.properties在与您的域模型相同的包中调用的文件,其中包含以下条目。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)
演示
下面的代码从 XML 文档填充对象模型,然后编组为 JSON。它演示了如何利用外部映射文件并将 MOXy 置于 JSON 模式。
package forum10699038;
import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
// READ FROM XML
JAXBContext jcXML = JAXBContext.newInstance(Metadata.class);
File xml = new File("src/forum10699038/input.xml");
Unmarshaller unmarshaller = jcXML.createUnmarshaller();
Metadata metadata = (Metadata) unmarshaller.unmarshal(xml);
// WRITE TO JSON
Map<String, Object> properties = new HashMap<String, Object>(3);
properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum10699038/oxm.xml");
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
JAXBContext jcJSON = JAXBContext.newInstance(new Class[] {Metadata.class}, properties);
Marshaller marshaller = jcJSON.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(metadata, System.out);
}
}
Run Code Online (Sandbox Code Playgroud)
输出
{
"artist" : [ {
"id" : "4302e264-1cf0-4d1f-aca7-2a6f89e34b36",
"type" : "Group",
"score" : "100",
"name" : "Farming Incident",
"ipi" : [ "1001" ]
} ]
}
Run Code Online (Sandbox Code Playgroud)
MOXY 和泽西岛
您可以在 JAXB-RS 环境(例如 Jersey)中轻松使用 MOXy 作为 JSON 提供程序:
其他文件
以下是我创建的文件版本,以确保一切正常运行。
输入.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#" xmlns:ext="http://musicbrainz.org/ns/ext#-2.0">
<artist-list offset="0" count="1">
<artist ext:score="100" type="Group"
id="4302e264-1cf0-4d1f-aca7-2a6f89e34b36">
<name>Farming Incident</name>
<ipi-list>
<ipi>1001</ipi>
</ipi-list>
</artist>
</artist-list>
</metadata>
Run Code Online (Sandbox Code Playgroud)
元数据
package forum10699038;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Metadata {
@XmlElement(name="artist-list")
ArtistList artistList;
}
Run Code Online (Sandbox Code Playgroud)
艺术家名单
package forum10699038;
import java.util.List;
public class ArtistList {
private List<Artist> artist;
}
Run Code Online (Sandbox Code Playgroud)
艺术家
package forum10699038;
import javax.xml.bind.annotation.*;
@XmlType(propOrder={"name", "ipiList"})
public class Artist {
@XmlAttribute
private String id;
@XmlAttribute
private String type;
@XmlAttribute(namespace="http://musicbrainz.org/ns/ext#-2.0")
private String score;
@XmlElement(name="ipi-list")
private IPIList ipiList;
private String name;
}
Run Code Online (Sandbox Code Playgroud)
IP列表
package forum10699038;
import java.util.List;
public class IPIList {
private List<String> ipi;
}
Run Code Online (Sandbox Code Playgroud)
包信息
@XmlSchema(
namespace = "http://musicbrainz.org/ns/mmd-2.0#",
elementFormDefault = XmlNsForm.QUALIFIED,
xmlns={
@XmlNs(prefix="", namespaceURI = "http://musicbrainz.org/ns/mmd-2.0#")
}
)
@XmlAccessorType(XmlAccessType.FIELD)
package forum10699038;
import javax.xml.bind.annotation.*;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5363 次 |
| 最近记录: |