java - 从 JAXB 和 Jersey 生成更多类似 json 的 json

标签 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>

并且在 Jersey 的帮助下,还使用 ​​Natural notation 生成 JSON

"artist-list":
    {"offset":0,
     "count":1,
     "artist":[
         {"score":"100",
          "type":"Group",
          "id":"4302e264-1cf0-4d1faca7-2a6f89e34b36",
          "name":"Farming Incident",
          "ipi-list":
              {
                  "ipi":[
                       "1001"
                    ]
             }
          }]
     }

Xml 没问题,json 几乎没问题,除了因为 Json 直接支持具有像 ipi-list 和 artist-list 这样的元素的数组看起来不是很 json,是否可以从我的模型生成更多像 json 的 json?

根据要求提供额外信息 json 是从此 MMD 模式生成的 http://svn.musicbrainz.org/mmd-schema/trunk/brainz-mmd2-jaxb/src/main/resources/musicbrainz_mmd-2.0.xsd使用 JAXB 和 Jersey , 看 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 看起来不正确所以我正在寻找一种改进它的方法(我真的不知道我自己对 json 有任何经验)

最佳答案

注意:我是 EclipseLink JAXB (MOXy) JAXB (JSR-222) 的领导和成员专家组。

您可以利用 EclipseLink JAXB (MOXy) 中的 JSON 绑定(bind)和外部映射文档来支持您的用例。

外部映射文件 (oxml.xml)

您可以在 MOXy 中使用 @XmlPath(".") 扩展来展平对象模型的各个部分。指定 "." 的路径告诉 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>

jaxb.properties

要将 MOXy 指定为您的 JAXB 提供者,您需要在与您的域模型相同的包中添加一个名为 jaxb.properties 的文件,其中包含以下条目。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示

下面的代码从您的 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);
    }

}

输出

{
   "artist" : [ {
      "id" : "4302e264-1cf0-4d1f-aca7-2a6f89e34b36",
      "type" : "Group",
      "score" : "100",
      "name" : "Farming Incident",
      "ipi" : [ "1001" ]
   } ]
}

MOXy 和 Jersey

您可以轻松地将 MOXy 用作 JAXB-RS 环境(例如 Jersey)中的 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>

元数据

package forum10699038;

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Metadata {

    @XmlElement(name="artist-list")
    ArtistList artistList;

}

艺术家列表

package forum10699038;

import java.util.List;

public class ArtistList {

    private List<Artist> artist;

}

艺术家

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;

}

IP 列表

package forum10699038;

import java.util.List;

public class IPIList {

    private List<String> ipi;

}

包信息

@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.*;

关于java - 从 JAXB 和 Jersey 生成更多类似 json 的 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10699038/

相关文章:

javascript - 使用 vanilla JavaScript 将 JSON 数据存储在变量中

java - Jaxb 编码解码而不是 Java Bean

java - JAXB unmarshaller.unmarshal 何时返回 JAXBElement<MySchemaObject> 或 MySchemaObject?

java - Checkstyle 关闭不适用于 Checkstyle Gradle

java - 将比例类型更改为 fitCenter 以获得应用程序样式背景图像

mysql - 如何将 NodeJs 响应转换为嵌套的 json 响应

java - Google Places API photo_reference

java - 如何从命令行运行 WAR 中的类?

java.sql.SQLException : No value specified for parameter 7

java - 如何使用jaxb在xml文件中创建表?