如何解析JSON数组

时间:2013-08-21 11:05:44

标签: json jaxb

我正面临解析JSON的以下情况。 我要解组的JSON包含一个数字(双精度)数组,如下所示:

"position":[52.50325,13.39062]

因此没有名称/值对。

问题是我无法获得此数组的值。在JSON的Java对象建模中,我将position属性定义为Doubles列表:List<Double>但是在unmarshel之后,position属性始终为null。

出于测试目的,我改变了JSON的内容:

position: [„52.50325“ ,“ 13.39062“ ]

然后没有问题,我得到了包含两个元素的列表。 (顺便说一下,无论位置被定义为字符串列表还是双打列表(List<String>List<Double>),都会发生这种情况。)

所以一个解决方法可能是改变JSON响应并在解组它之前将这个数字标记为字符串,但我想避免这种情况,我想知道是否有解决方案来获取数字数组的值? / p>

以下是代码中的快照:

ResultsListDO.java

@XmlElement(required = true)
protected List<Double> position;

public List<Double> getPosition()
{
  if (position == null) {
    position = new ArrayList<Double>();
  }

  return this.position;
}

JSON unmarshal:

context = new JSONJAXBContext(JSONConfiguration.mapped().build(), ResultsListDO.class);
JSONUnmarshaller um = context.createJSONUnmarshaller();
ResultsListDO resultsList = um.unmarshalFromJSON(source.getReader(), ResultsListDO.class);

1 个答案:

答案 0 :(得分:1)

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

除非您使用@XmlAccessorType(XmlAccessType.FIELD)注释了您的课程,否则问题可能是您的注释位于字段上而不是get方法(请参阅:http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html)。

import java.util.*;
import javax.xml.bind.annotation.XmlElement;

public class Foo {

    protected List<Double> position;

    @XmlElement(required = true)
    public List<Double> getPosition()
    {
      if (position == null) {
        position = new ArrayList<Double>();
      }

      return this.position;
    }

}

演示代码

下面我将演示一切都可以使用MOXy作为JSON绑定提供程序。

<强> jaxb.properties

要将MOXy指定为JAXB提供程序,您需要在与域模型相同的程序包中包含名为jaxb.properties的文件,并带有以下条目(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。

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

<强>演示

import java.util.*;

import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String,Object>();
        properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
        properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Foo.class}, properties);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StreamSource json = new StreamSource("src/forum18355753/input.json");
        Foo foo = unmarshaller.unmarshal(json, Foo.class).getValue();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}

<强> input.json /输出

{
   "position" : [ 52.50325, 13.39062 ]
}