2

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

"position":[52.50325,13.39062]

所以没有名称/值对。

问题是我无法获得这个数组的值。在对 JSON 进行建模的 Java 对象中,我将位置属性定义为双精度列表:List<Double>但在解组之后,位置属性始终为空。

出于测试目的,我像这样更改了 JSON 的内容:

position: [„52.50325“ ,“ 13.39062“ ]

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

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

这是代码的快照:

ResultsListDO.java

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

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

  return this.position;
}

JSON解组:

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

1 回答 1

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

}

输入.json/输出

{
   "position" : [ 52.50325, 13.39062 ]
}
于 2013-08-26T20:56:01.793 回答