Java解析json——Jackson
来源:互联网 发布:软件缺陷生命周期 编辑:程序博客网 时间:2024/06/01 09:44
在Java下,想要解析json文件,已经有了现成的Jackson框架。
有几个关于Jackson的基础例子,或者也可以看本文最后的附录。看过之后也就大致了解Jackson的基本用法了。至少Java对象和json的直接转化还是比较简单的。
在这里,我主要记录一下自己使用readTree从服务器接收json并解析的过程。
需求
写一个客户端程序,客户端从服务器接收json,并解析为Java自己的对象,进行处理。客户端与服务器之间的通信使用的是最基本的Socket通信。
难点
- 需要从InputStream,流式读取json。
- 读取到的json可能是多种Java对象。
在我的需求中,服务器发送来的json可能会对应Java中的多种任务对象:RebootTask、UpdateTask、TicketResTask。而他们都有一个共同的父类ServerTask。在json中,使用了一个“type”字段标识他们分别是哪一种任务类型。
策略
不能直接简单的像附录一样读取并转换json,需要对json的type字段进行判断,然后才能根据type进行转换。因此,需要解析json的节点。而JsonNode可以解决我们这方面的需求。
查官网,在ObjectMapper中有readTree方法,可以从InputStream中读取数据。其返回的形式恰好为JsonNode,正好可以解决上面的两个难题。
实现
首先,我们需要初始化一个ObjectMapper,用以接收json。如果没有什么特殊需求,ObjectMapper可以简单创建ObjectMapper mapper = new ObjectMapper();
,不过在这里我需要保证Socket保持连接,而不会在读取一次之后就关闭,所以需要在初始化的时候多加入一些设定。具体可以参照JsonFactory,设定其Feature。类似的还有JsonParser的Feature,JsonGenerator的Feature。有更多需求的话再去看吧。
//初始化jackson,保持socket始终连通,不会在读写一次后关闭socket连接JsonFactory jsonFactory = new JsonFactory();jsonFactory.disable(JsonParser.Feature.AUTO_CLOSE_SOURCE);ObjectMapper mapper = new ObjectMapper(jsonFactory);//读取jsonJsonNode rootNode = mapper.readTree(cinemaClient.getInputStream());
拿到JsonNode对象之后,就可以使用其public abstract JsonNode path(String fieldName)
方法,获取type字段的内容。
然后根据public <T> T treeToValue(TreeNode n, Class<T> valueType)
方法,将JsonNode(implements TreeNode)传入,再传入需要转换成的Java对象的class即可。
具体代码中,我们是将json(数组,包含多个对象)转换为多个对象,然后存到ArrayList中的,ArrayList的类型为所有任务的父类ServerTask:
/** * 根据Server发来的json文件解析ServerTask,生成ServerTask对象 * @param mapper * @param rootNode * @return */ private ArrayList<ServerTask> parseTask(ObjectMapper mapper, JsonNode rootNode) { try { //获取taskList列表 JsonNode taskList = rootNode.path(Constant.CONST_TASKLIST); ArrayList<ServerTask> serverTasks = new ArrayList<ServerTask>(); if(taskList.isArray()) { //遍历taskList,获取type字段,并根据type将任务解析为相应的对象 for(JsonNode jNode : taskList) { //两句核心代码 String type = jNode.path(Constant.CONST_TYPE).asText(); serverTasks.add(mapper.treeToValue(jNode, getTaskClass(type))); } } return serverTasks; } catch (IOException e) { e.printStackTrace(); System.out.println("Server发送json有误:任务列表不是Array。"); System.out.println("Server sending json ERROR: taskList is not an Array."); return null; } }
在上面的代码中,为了方便传入Java对象的class进行转换,我们可以先写一个根据type字段的值返回对象类型的小函数:
/** * 返回ServerTask子类的类类型 * @param type * @return */ private Class<? extends ServerTask> getTaskClass(String type) { switch (type) { case Constant.CONST_TICKETRES : return TicketResTask.class; case Constant.CONST_UPDATE : return UpdateTask.class; case Constant.CONST_REBOOT : return RebootTask.class; default: System.out.println("json任务类型出错!"); System.out.println("Type of mission in json ERROR!"); return null; } }
至此,解析完毕。就可以完全由Java去处理ArrayList<ServerTask>
对象了。
附:基础的Java对象与json转换小示例
public static <T> T fromJson(Object object, TypeReference<T> clazz) {// ObjectMapper mapper = new ObjectMapper(); try { if(object instanceof String){ return mapper.readValue((String) object, clazz); } else if(object instanceof File){ return mapper.readValue((File) object, clazz); } else return null; } catch (IOException e) { e.printStackTrace(); return null; } }
然后就可以将json转换为TicketResTask类型的Java对象了——
读取并转换单个:
TicketResTask ticketTask = fromJson(new File("CinemaClient/resource/TicketResTask.json"), new TypeReference<TicketResTask>() {});
读取并转换多个:
ArrayList<TicketResTask> ticketTasks = fromJson(new File("CinemaClient/resource/TicketResTasks.json"), new TypeReference<ArrayList<TicketResTask>>() {});
public static boolean toJsonFile(File file, Object object) {// ObjectMapper mapper = new ObjectMapper(); try { mapper.writeValue(file, object); } catch (IOException e) { e.printStackTrace(); return false; } return true; } public static String toJson(Object object) { try {// ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(object); } catch (JsonProcessingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
- Java解析json——Jackson
- java json解析-jackson
- java json解析-jackson
- java json解析-jackson
- java json解析fastjson jackson
- Java解析json(二):jackson
- Android中解析Json——Jackson使用
- JackSon——轻松解析Json/XML数据
- Android中解析Json——Jackson使用
- Android中解析Json——Jackson使用
- jackson解析 json字符串
- Jackson解析JSON例子
- Jackson解析JSON例子
- jackson框架解析json
- Jackson解析JSON数据
- Json解析工具Jackson
- Jackson解析JSON例子
- Json解析工具Jackson
- 《Java源码分析》:PriorityQueue
- Android自定义View之可随时暂停、开启的圆形下载进度条
- web项目实战实现焦点图轮播
- gpiolib及gpio操作
- 最优化导论1
- Java解析json——Jackson
- Spring Integration
- 特征选择与特征学习
- Java中synchronized使用的一点见解
- MogileFS与FastDFS的个人见解
- 八大内部排序--希尔排序
- javascript有哪些方法能够实现继承
- docker搭建hadoop分布式集群
- swift+UIPageViewController 纯代码实现引导页