从JAXB和Jersey生成更多json,如json

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.javahttp://svn.musicbrainz.org/search_server/trunk /servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ArtistWriter.java

关键是我希望能够从一个模式生成Json和XML,但是显然Json看起来不对,所以我正在寻找一种方法来改进它(我真的没有任何经验我自己)

bdo*_*han 3

注意: 我是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)