2

我有这堂课:

 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": { .. }, ..
  }
}

谁能帮忙?

4

3 回答 3

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);
    }

}

了解更多信息

于 2013-10-24T09:48:48.640 回答
1

使用这个工具;我遇到了你描述的同样的问题。我们用来让它工作的解决方案是将我们的 Maven 依赖项从 Jackson 更改为 json-lib。我们使用这个网站作为指南

如果使用 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"
}
于 2013-10-24T08:10:13.007 回答
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": { .. }, ..
  }
于 2013-10-25T02:10:32.487 回答