XML包装器JSON格式问题

时间:2013-10-24 07:57:38

标签: java xml json xml-parsing

我有这堂课:

 class A {
      @XmlElement(name = "bees")
      @XmlElementWrapper(name="bee")
      public List<B> bees;
    }

然后我的XML看起来像:

<a>
  <bees>
    <bee>...</bee>
    <bee>...</bee>
  </bees>
</a>

但是当通过JSON使用时:

{
  "bees": {
    "bee": [
      ....
    ]
  }
}

我需要:

  {
  "bees": {
    "bee": { .. }, "bee": { .. }, ..
  }
}

任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

而不是:

{
  "bees": {
    "bee": { .. }, 
    "bee": { .. }, 
    ..
  }
}

我会推荐以下内容:

{
   "bees" : [ 
       { .. }, 
       { .. },
       ..
   } ]
}

下面是如何使用MOXy根据您的映射生成此JSON:

import java.util.*;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.eclipse.persistence.jaxb.MarshallerProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
        properties.put(JAXBContextProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {A.class}, properties);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StreamSource xml = new StreamSource("src/forum19560166/input.xml");
        A a = unmarshaller.unmarshal(xml, A.class).getValue();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
        marshaller.marshal(a, System.out);
    }

}

了解更多信息

答案 1 :(得分:1)

使用此tools;我遇到了您所描述的相同问题。我们用来解决这个问题的解决方案是将我们的Maven依赖从Jackson更改为json-lib。我们将此网站用作guide

如果使用maven,

为你的pom添加依赖关系。

<dependency>
        <groupId>net.sf.json-lib</groupId>
        <artifactId>json-lib</artifactId>
        <version>2.3</version>
        <type>jar</type>
        <classifier>jdk15</classifier>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>xom</groupId>
        <artifactId>xom</artifactId>
        <version>1.1</version>
    </dependency>
  </dependencies>

将此xml保存在示例文件sample-xml.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <important-data certified="true" processed="true">
      <timestamp>232423423423</timestamp>
      <authors>
        <author>
          <firstName>Tim</firstName>
          <lastName>Leary</lastName>
        </author>
      </authors>
      <title>Flashbacks</title>
      <shippingWeight>1.4 pounds</shippingWeight>
      <isbn>978-0874778700</isbn>
    </important-data>

主要课程

package com.discursive.answers;

import java.io.InputStream;

import net.sf.json.JSON;
import net.sf.json.xml.XMLSerializer;

import org.apache.commons.io.IOUtils;

public class ConvertXMLtoJSON {

        public static void main(String[] args) throws Exception {
                InputStream is = 
                        ConvertXMLtoJSON.class.getResourceAsStream("sample-xml.xml");
                String xml = IOUtils.toString(is);

                XMLSerializer xmlSerializer = new XMLSerializer(); 
                JSON json = xmlSerializer.read( xml );  
                System.out.println( json.toString(2) );
        }
}

结果

{
  "@certified": "true",
  "@processed": "true",
  "timestamp": "232423423423",
  "authors": [  {
    "firstName": "Tim",
    "lastName": "Leary"
  }],
  "title": "Flashbacks",
  "shippingWeight": "1.4 pounds",
  "isbn": "978-0874778700"
}

答案 2 :(得分:0)

以类似的结尾:

public class BeeDetails
{
    public string details { get; set; }

}

public class Bee
{
    public BeeDetails { get; set; }
}

public class BeeResponse
{
    public List<Bee> Bees { get; set; }
}

得到这个:

 {
  "bees": {
    "bee": { .. }, "bee": { .. }, ..
  }