美文网首页
jackson 操作

jackson 操作

作者: thinking2019 | 来源:发表于2020-06-24 11:05 被阅读0次

架包

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.0</version>
</dependency>
1.树模型:提供一个 JSON 文档可变内存树的表示形式
public void write() throwsIOException {      
    //JsonNodeFactory 实例,可全局共享  
    privateJsonNodeFactory jsonNodeFactory = JsonNodeFactory.instance;  
    //JsonFactory 实例,线程安全  
    privateJsonFactory jsonFactory = newJsonFactory();         
    //根节点  
    ObjectNode rootNode = jsonNodeFactory.objectNode();  
    //往根节点中添加普通键值对  
    rootNode.put("name","aaa");  
    rootNode.put("email","aaa@aa.com");  
    rootNode.put("age",24);  
    //往根节点中添加一个子对象  
    ObjectNode petsNode = jsonNodeFactory.objectNode();  
    petsNode.put("petName","kitty")  
            .put("petAge",3);  
    rootNode.set("pets", petsNode);  
    //往根节点中添加一个数组  
    ArrayNode arrayNode = jsonNodeFactory.arrayNode();  
    arrayNode.add("java")  
             .add("linux")  
             .add("mysql");  
    rootNode.set("skills", arrayNode);  
    //调用ObjectMapper的writeTree方法根据节点生成最终json字符串  
    JsonGenerator generator = jsonFactory.createGenerator(System.out);  
    ObjectMapper objectMapper = newObjectMapper();  
    objectMapper.writeTree(generator, rootNode);  
}  
public void read() throwsJsonParseException, JsonMappingException, IOException {  
    ObjectMapper objectMapper = newObjectMapper();  
    //使用ObjectMapper的readValue方法将json字符串解析到JsonNode实例中  
    JsonNode rootNode = objectMapper.readTree(jsonString);  
    //直接从rootNode中获取某个键的值,  
    //这种方式在如果我们只需要一个长json串中某个字段值时非常方便  
    JsonNode nameNode = rootNode.get("name");  
    String name = nameNode.asText();  
    System.out.println(name);  
    //从 rootNode 中获取数组节点  
    JsonNode skillsNode = rootNode.get("skills");  
    for(inti = 0;i < skillsNode.size();i++) {  
        System.out.println(skillsNode.get(i).asText());  
    }  
    //从 rootNode 中获取子对象节点  
    JsonNode petsNode = rootNode.get("pets");  
    String petsName = petsNode.get("petName").asText();  
    System.out.println(petsName);  
}
2.数据绑定:JSON和POJO相互转换,基于属性访问器规约或注解
public void write() throwsIOException {
    // JSON操作的核心
    ObjectMapper mapper = new ObjectMapper();
    // 把arg1转成json序列,并保存到arg0文件中。
    mapper.writeValue(File arg0, Object arg1);
    // 把arg1转成json序列,并保存到arg0输出流中。
    mapper.writeValue(OutputStream arg0, Object arg1);
    // 把arg0转成json序列,并把结果输出成字节数组。
    mapper.writeValueAsBytes(Object arg0);
    // 把arg0转成json序列,并把结果输出成字符串。
    mapper.writeValueAsString(Object arg0);

    // 将User对象转换成json
    String json = mapper.writeValueAsString(user);
    // 将List对象转换错json
    json = mapper.writeValueAsString(list);
    System.out.println(json);
}
public void read() throwsIOException {
        // JSON操作的核心
        ObjectMapper mapper = new ObjectMapper();
        // 将jsonString转换成 Student 对象
        Student student = mapper.readValue(jsonString, Student.class);
        // json字符串转为Map对象
        Map map=mapper.readValue(jsonString, Map.class);
        // 读取JSON文件转换为对象
        Student student2 = mapper.readValue(new File("student.json"), Student.class);
        //json文件转换为map
        Map<String,Object> studentDataMap = mapper.readValue(new File("d:/student2.json"), Map.class);

        // 树形遍历
        JsonNode rootNode = mapper.readTree(jsonString);
        rootNode = mapper.readTree(new FileInputStream("student.json"));
    }
3.流式API:不到需要考虑性能的时候,一定不要使用这种方式
public void read() throws JsonParseException, IOException{
        JsonFactory factory = new JsonFactory();
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("user.json");
        JsonParser jsonParse = factory.createJsonParser(is);
        User user = new User();
        JsonToken token = jsonParse.nextToken();
        if(token==JsonToken.START_OBJECT){
            while((jsonParse.nextToken())!=JsonToken.END_OBJECT){
                String fieldName = jsonParse.getCurrentName();
                jsonParse.nextToken();
                if("name".equalsIgnoreCase(fieldName)){
                    Name name = new Name();
                    while(jsonParse.nextToken()!=JsonToken.END_OBJECT){
                        if(jsonParse.getCurrentName().equals("first")){
                            name.setFirst(jsonParse.getText());
                        }
                        if(jsonParse.getCurrentName().equals("last")){
                            name.setLast(jsonParse.getText());
                        }
                    }
                    user.setName(name);
                }else if("gender".equals(fieldName)){
                    String text = jsonParse.getText();
                    user.setGender(Gender.valueOf(text));
                }else if("verified".equals(fieldName)){
                    user.setVerified(jsonParse.getBooleanValue());
                }else if("userImage".equals(fieldName)){
                    user.setUserImage(jsonParse.getBinaryValue());
                }
            }
        }
        jsonParse.close();
    }
public void write() throws IOException{
        JsonFactory jsonFactory = new JsonFactory();
        JsonGenerator jg = jsonFactory.createGenerator(new File("user2.json"), JsonEncoding.UTF8);
        jg.useDefaultPrettyPrinter();
        jg.writeStartObject();
        jg.writeObjectFieldStart("name");
        jg.writeStringField("first", "Joe");
        jg.writeStringField("last", "Sixpack");
        jg.writeEndObject();
        jg.writeStringField("gender", Gender.MALE.name());
        jg.writeBooleanField("verified", false);
        jg.writeFieldName("userImage");
        byte[] binaryData = new byte[]{70, 111, 111, 98, 97, 114, 33};
        jg.writeBinary(binaryData);
        jg.writeEndObject();
        jg.close();
    }

长期更新的公众号:Java技术学习笔记

Java技术学习笔记

相关文章

网友评论

      本文标题:jackson 操作

      本文链接:https://www.haomeiwen.com/subject/yetrfktx.html