2017-04-11 64 views
0

我充满了叽叽喳喳的鸣叫一个JSON文件,如下所示:解析JSON文件POJO使用杰克逊

{"text": "RT @7NewsSydney: Fire rips through party island Ibiza. #7News, "lang": "en", "coordinates": { "coordinates": [150.595679, -34.187708] , "type":"Point"}, "created_at": "Mon Mar 06 22:47:10 +0000 2017"} 

{"text": "Fire rips through party island Ibiza. #7News ", "user": {"id": "156464691", "name": "7 News Sydney"}, "lang": "en","created_at": "Mon Mar 06 22:43:11 +0000 2017"} 

我想将它们转换成POJO,我已经定义了微博类

import java.io.*; 
import java.util.*; 

import com.fasterxml.jackson.databind.*; 

public class Tweets { 
    private int id; 
    private String username; 
    private String text; 
    private int coordinates; 
    private String timestamp; 
} 

ObjectMapper mapper = new ObjectMapper(); 
Tweets tweets = mapper.readValue(new File(tweets.json), Tweets.class); 

我有这个麻烦 1.推文不一样,例如,第一条推文有一个坐标键值,第二条推文没有。

此解析技术是否正确?有人可以帮助

+0

我敢肯定,如果文件不包含tweet对象一个无效的json数组,因此映射程序无法解析它 - 并且无法将_two_ tweet分析为_one_ pojo。你可能想要分割你的文件(例如按行)或重构它以包含顶层数组,然后将其解析为'Tweets []'。 – Thomas

+0

你是什么意思由此“我敢肯定,如果该文件不包含数组中不是有效的json,因此映射器无法解析它的tweet对象”,是的,我想读它的行按行,那么我该怎么做? – Kutam

+0

我的意思是'{...} {...}'不是有效的json,它应该是'[{..},{...}]'。但是,如果你想逐行阅读文件,应该没问题,因为你每行只有一个json对象。你应该寻找如何逐行阅读文件。我会给你一个提示:'BufferedReader'。 – Thomas

回答

0

坐标应该有不同的定义(它不是一个整数,而是一个double和一个字符串数组的组合对象)。 如果您想要解析文件中定义的多个JSON对象,则必须逐行执行,因为它不是JSON数组,而是每行包含JSON对象的一系列行。我会将该类重命名为Tweet,并在Tweet列表中添加逐行解析的推文。 如果没有坐标,它不是问题,如果不存在,它们将被设置为空。如果你最终不想输出它们,你可以使用注释@JsonInclude(JsonInclude.Include.NON_NULL)在类的顶部

+0

所以我想逐行解析json。所以每条推文都是一个POJO对象。那么你怎么做坐标?并假设为“ID”它是在“用户”的对象有两个键是“ID”和“名称”,以便如何解决这个问题? – Kutam

+0

对于用户,我将创建另一个Jackson obect用户,其用户的属性是id和name(都是String)。相同的坐标,将具有属性坐标(双数组)和类型(字符串)。 – flavio