2014-06-17 102 views
0

我用于成功地解析以下上传.json文件:如何解析与杰克逊嵌套数组?

[ 
    { 
     "latitude": 49.419459253939316, 
     "longitude": 8.676411621072491 
    }, 
    { 
     "latitude": 49.41946061080915, 
     "longitude": 8.676411644939083 
    }, 
    { 
     "latitude": 49.420365910782735, 
     "longitude": 8.676438042403413 
    } 
] 

以下Jackson script输出点的List

private static <T> List<T> parseFile(final String fileName, 
            Class<T> contentType) { 
    // ... 
    InputStream inputStream = // Open file 
    ObjectMapper objectMapper = new ObjectMapper(); 
    try { 
     TypeFactory typeFactory = objectMapper.getTypeFactory(); 
     CollectionType collectionType = typeFactory 
      .constructCollectionType(List.class, contentType); 
     return objectMapper.readValue(inputStream, collectionType); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

现在数据集变得更加复杂。点的List变成点的ListList。 我这样构造它 - 如果这是不正确的请纠正我。

[ 
    [ 
     { 
      "latitude": 49.419459253939316, 
      "longitude": 8.676411621072491 
     }, 
     { 
      "latitude": 49.41946061080915, 
      "longitude": 8.676411644939083 
     }, 
     { 
      "latitude": 49.420365910782735, 
      "longitude": 8.676438042403413 
     } 
    ], 
    [ 
     { 
      "latitude": 49.40460334213399, 
      "longitude": 8.670034018853409 
     }, 
     { 
      "latitude": 49.404608057285145, 
      "longitude": 8.670028775634165 
     }, 
     { 
      "latitude": 49.40506145685422, 
      "longitude": 8.66955817506422 
     } 
    ] 
] 

我准备了以下的POJOs将数据存储到:

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

...

public class ThreePoints { 
    public List<GeoPoint> points; 
} 

怎么办我必须要改变上述杰克逊解析器,因此它可以处理嵌套数组?杰克逊可以将数据解析为一个嵌套的类结构,例如ThreePoints.class

回答

1

你可以写一个简单的自定义解串器

要将其反序列化到您的类:

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

public class ThreePoints { 
    public List<GeoPoint> points; 
} 

编写自定义解串器:

class ThreePointsDeserializer extends StdDeserializer<ThreePoints> { 

    protected ThreePointsDeserializer() { 
     super(ThreePoints.class); 
    } 


    @Override 
    public ThreePoints deserialize(JsonParser parser, DeserializationContext ctx) 
      throws IOException, JsonProcessingException { 
     ThreePoints result = new ThreePoints(); 
     GeoPoint[] points = parser.getCodec().readValue(parser, GeoPoint[].class); 
     result.points = Arrays.asList(points); 
     return result; 
    } 
} 

使用该解串器:

SimpleModule module = new SimpleModule(); 
module.addDeserializer(ThreePoints.class, new ThreePointsDeserializer()); 

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(module); 

TypeFactory tf = mapper.getTypeFactory(); 
CollectionType collectionType = tf.constructCollectionType(List.class, ThreePoints.class); 

List<ThreePoints> result = mapper.readValue(YOUR_DATA, collectionType); 
2

您可以简单地创建额外的集合类型。请参见下面的代码:

TypeFactory typeFactory = mapper.getTypeFactory(); 
CollectionType listType = typeFactory.constructCollectionType(List.class, contentType); 
CollectionType listListType = typeFactory.constructCollectionType(List.class, listType); 
List<List<GeoPoint>> readValue = mapper.readValue(json, rootCollectionType); 
// convert to ThreePoints 

编辑
不幸的是,你不能告诉JacksonJSONPOJO类进行转换,因为他们不适合对方。 Jackson也不包含可用于将JSON映射到POJO类的注释。你必须手动完成。使用我的代码,您可以编写ThreePoints类的定制解串器,您可以在其中使用内部ObjectMapper和我的上述代码。我认为,你将能够轻松地将List<List<GeoPoint>> readValue转换为ThreePoints类。另一种选择 - 你可以在你的类里写一个简单的函数JsonUtil。如果你真的不能改变这个JSON你必须手动完成。

+0

你可以吗租赁更新您的解决方案,以显示如何生成一个'List '? – JJD

0

您需要先读取Matrix的值, 首先需要使用名为Place的Pojo来映射值。

public class Place { 

    double latitude; 
    double longitude; 

    public double getLatitude() { 
     return latitude; 
    } 

    public void setLatitude(double latitude) { 
     this.latitude = latitude; 
    } 

    public double getLongitude() { 
     return longitude; 
    } 

    public void setLongitude(double longitude) { 
     this.longitude = longitude; 
    } 
}  

第二步,您需要将JsonNode映射到Matrix。

import java.io.IOException; 
import java.util.List; 
import org.codehaus.jackson.JsonNode; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.type.CollectionType; 
import org.codehaus.jackson.map.type.TypeFactory; 


public class Main { 
    static String jsonString = "[" + 
" [" + 
"  {" + 
"   \"latitude\": 49.419459253939316," + 
"   \"longitude\": 8.676411621072491" + 
"  }," + 
"  {" + 
"   \"latitude\": 49.41946061080915," + 
"   \"longitude\": 8.676411644939083" + 
"  }," + 
"  {" + 
"   \"latitude\": 49.420365910782735," + 
"   \"longitude\": 8.676438042403413" + 
"  }" + 
" ]," + 
" [" + 
"  {" + 
"   \"latitude\": 49.40460334213399," + 
"   \"longitude\": 8.670034018853409" + 
"  }," + 
"  {" + 
"   \"latitude\": 49.404608057285145," + 
"   \"longitude\": 8.670028775634165" + 
"  }," + 
"  {" + 
"   \"latitude\": 49.40506145685422," + 
"   \"longitude\": 8.66955817506422" + 
"  }" + 
" ]" + 
"]"; 

    public static void main(String...args) { 
     final ObjectMapper om = new ObjectMapper(); 
     try { 
      final Place[][] dtos = om.readValue(new ObjectMapper() 
       .readValue(jsonString, JsonNode.class), Place[][].class); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

干杯。

+0

我想将它解析成'List'。 – JJD