2013-10-12 50 views
32

鉴于以下以.json文件:JsonMappingException:出START_ARRAY令牌

[ 
    { 
     "name" : "New York", 
     "number" : "732921", 
     "center" : [ 
       "latitude" : 38.895111, 
       "longitude" : -77.036667 
      ] 
    }, 
    { 
     "name" : "San Francisco", 
     "number" : "298732", 
     "center" : [ 
       "latitude" : 37.783333, 
       "longitude" : -122.416667 
      ] 
    } 
] 

我准备了两个类来表示所包含的数据:

public class Location { 
    public String name; 
    public int number; 
    public GeoPoint center; 
} 

...

public class GeoPoint { 
    public double latitude; 
    public double longitude; 
} 

为了解析.json文件中的内容,我使用了Jackson 2.2.x并准备了以下方法:

public static List<Location> getLocations(InputStream inputStream) { 
    ObjectMapper objectMapper = new ObjectMapper(); 
    try { 
     TypeFactory typeFactory = objectMapper.getTypeFactory(); 
     CollectionType collectionType = typeFactory.constructCollectionType(
              List.class, Location.class); 
     return objectMapper.readValue(inputStream, collectionType); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

只要我遗漏了center属性,所有的内容都可以被解析。然而,当我尝试分析地理坐标我结束了以下错误消息:

com.fasterxml.jackson.databind.JsonMappingException:无法反序列化
com.example.GeoPoint的实例出来的START_ARRAY token at [Source:[email protected];行:5,柱:25]
(通过参考链:com.example.Location [ “中心”])

+0

为什么你使用杰克森,如果你可以简单地用json解析器解析它 –

+3

你的JSON字符串格式不正确,'center'类型是一个无效对象数组。尝试用'经度'和'纬度'附近的JSON字符串中的{'和'}替换'['和']',以便它们成为对象。 – Katona

+0

@Katona谢谢。您能否将您的评论转换为答案,以便我可以解决这个问题? – JJD

回答

31

你的JSON字符串格式错误:的center类型是无效对象的数组。围绕longitudelatitude所以他们会对象JSON字符串替换[]{}

[ 
    { 
     "name" : "New York", 
     "number" : "732921", 
     "center" : { 
       "latitude" : 38.895111, 
       "longitude" : -77.036667 
      } 
    }, 
    { 
     "name" : "San Francisco", 
     "number" : "298732", 
     "center" : { 
       "latitude" : 37.783333, 
       "longitude" : -122.416667 
      } 
    } 
] 
33

JsonMappingException: out of START_ARRAY token异常是由杰克逊的对象映射器,因为它是在等一个Object {},而它在响应中发现的Array [{}]抛出。

这可以通过在geForObject("url",Object[].class)的参数中将Object替换为Object[]来解决。 参考文献:

  1. Ref.1
  2. Ref.2
  3. Ref.3
+0

谢谢,基本但必要的信息 –

+0

这对我有用!我有一个Product.class,我只是添加了Product []。class。巴姆!加工。感谢Abhijeet! – Jonathan

1

至于说,JsonMappingException: out of START_ARRAY token异常是由杰克逊的对象映射器,因为它是在等一个Object {},而它在响应中发现的Array [{}]抛出。

一个简单的解决方案可以与被替换的方法getLocations

public static List<Location> getLocations(InputStream inputStream) { 
    ObjectMapper objectMapper = new ObjectMapper(); 
    try { 
     TypeReference<List<Location>> typeReference = new TypeReference<>() {}; 
     return objectMapper.readValue(inputStream, typeReference); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

在另一方面,如果你没有像Location一个POJO,你可以使用:

TypeReference<List<Map<String, Object>>> typeReference = new TypeReference<>() {}; 
return objectMapper.readValue(inputStream, typeReference); 
+0

感谢您分享此替代实施。你能说出使用'CollectionType'与'TypeReference'是否有优点或缺点吗? – JJD

+0

'TypeReference'语法比另一个短得多。不确定的是,如果在某些情况下可能存在与类型擦除相关的反指示...但是在我的世界中,“类型参考”更容易使用和理解。 – freedev

相关问题