我正面临解析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);
答案 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 ]
}