Spring Boot—08Jackson处理JSON



package com.sample.smartmap.controller;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.bee.sample.ch3.entity.User;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;

@Controller
@RequestMapping("/jackson")
public class JacksonSampleController {
    
    Log log = LogFactory.getLog(JacksonSampleController.class);
    //参考JacksonConf
    @Autowired ObjectMapper mapper;
    
    @GetMapping("/now.json")
    public @ResponseBody Map now(){
        Map map = new HashMap();
        map.put("date", new Date());
        return map;
    }
    
    // 以类似于XML DOM的方式进行解析JSON格式的数据
    @GetMapping("/readtree.json")
    public @ResponseBody String readtree() throws JsonProcessingException, IOException{
        String json = "{\"name\":\"lijz\",\"id\":10}";
        JsonNode node = mapper.readTree(json);
        
        String name = node.get("name").asText();
        int id = node.get("id").asInt();
        return "name:"+name+",id:"+id;
        
    }
    
    // 以对象绑定的方式解析JSON数据
    @GetMapping("/databind.json")
    public @ResponseBody String databind() throws JsonProcessingException, IOException{
        String json = "{\"name\":\"lijz\",\"id\":10}";
        User user = mapper.readValue(json, User.class);
        return "name:"+user.getName()+",id:"+user.getId();
        
    }
    
    // 将对象转化为JSON字符串
    @GetMapping("/serialization.json")
    public @ResponseBody String custom() throws JsonProcessingException {

        User user = new User();
        user.setId(1l);
        user.setName("hello");
        String str = mapper.writeValueAsString(user);
        
        return str;
        
    }
    

    
@JsonIgnoreProperties ({"id","photo"})
    public static class SamplePojo{
        Long id;

        String name;

        byte[] photo;

        @JsonIgnore
        BigDecimal salary;

        Map<String , Object> otherProperties = new HashMap<String , Object>();

        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public byte[] getPhoto() {
            return photo;
        }
        public void setPhoto(byte[] photo) {
            this.photo = photo;
        }
        public BigDecimal getSalary() {
            return salary;
        }
        public void setSalary(BigDecimal salary) {
            this.salary = salary;
        }

        @JsonAnyGetter
        public Map<String, Object> getOtherProperties() {
            return otherProperties;
        }

         @JsonAnySetter
        public void setOtherProperties(Map<String, Object> otherProperties) {
            this.otherProperties = otherProperties;
        }
         
    }

// 以Token的方式生成Java对象
public static class Usererializer extends JsonSerializer<User> {  
    @Override  
    public void serialize(User value, JsonGenerator jgen, SerializerProvider provider)   
      throws IOException, JsonProcessingException {  
        jgen.writeStartObject();  
        jgen.writeStringField("user-name", value.getName());  
        jgen.writeEndObject();  
    }  
}  
// 以XML DOM的方式生成Java对象   
public class UserDeserializer extends JsonDeserializer<User> {  
       
    @Override  
    public User deserialize(JsonParser jp, DeserializationContext ctxt)   
      throws IOException, JsonProcessingException {  
        JsonNode node = jp.getCodec().readTree(jp);  
        String name = node.get("user-name").asText(); 
        User user = new User();
        user.setName(name);
        return user;
    }  
}  
    
    
}



package com.smartmap.sample.conf;

import java.text.SimpleDateFormat;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import com.fasterxml.jackson.databind.ObjectMapper;

@Configuration
public class JacksonConf {

    @Bean
    @Primary
    public ObjectMapper getObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        return objectMapper;
    }
}


package com.smartmap.sample.entity;

import java.math.BigDecimal;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonView;

public class User {
    public interface IdView {};
    public interface IdNameView extends IdView {};
    
    @JsonView(IdView.class)
    private Integer id;

    @JsonView(IdNameView.class)
    private String name;

    @JsonIgnore
    BigDecimal salary;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BigDecimal getSalary() {
        return salary;
    }

    public void setSalary(BigDecimal salary) {
        this.salary = salary;
    }

}

package com.smartmap.sample.controller;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.smartmap.sample.entity.User;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonView;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

@Controller
public class DataBindController {
    @Autowired
    ObjectMapper mapper;

    @RequestMapping("/updateUsers.json")
    public @ResponseBody String say(@RequestBody List<User> list) {
        StringBuilder sb = new StringBuilder();
        for (User user : list) {
            sb.append(user.getName()).append(" ");
        }
        return sb.toString();
    }

    @RequestMapping("/customize.json")
    public @ResponseBody String customize() throws JsonParseException, JsonMappingException, IOException {
        String jsonInput = "[{\"id\":2,\"name\":\"xiandafu\"},{\"id\":3,\"name\":\"lucy\"}]";
        JavaType type = getCollectionType(List.class,User.class);
        List<User> list = mapper.readValue(jsonInput, type);
        return String.valueOf(list.size());
    }
    
    //产生一个集合类型说明
    public JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {
        return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
    }
    
    // User的ID字段不转化为JSON
    @JsonView(User.IdView.class)
    @RequestMapping("/id.json")
    public @ResponseBody User queryIds() {
        User user = new User();
        user.setId(1);
        user.setName("hell");
        return user;
    }
    
    @RequestMapping("/dept.json")
    public @ResponseBody Department getDepartment() {
        return new Department(1);
    }
    
    class Department {
        Map map = new HashMap();
        int id ;
        public Department(int id){
            this.id = id;
            map.put("newAttr", 1);
        }
        // 将其它任何不配的键值都放入map中
        @JsonAnyGetter
        public Map<String, Object> getOtherProperties() {
          return map;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        
        
    }
    
}

package com.smartmap.sample.controller;

import java.io.IOException;
import java.io.StringWriter;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.smartmap.sample.entity.User;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.ObjectMapper;

@Controller
@RequestMapping("/stream")
public class JacksonStreamController {
    Log log = LogFactory.getLog(JacksonStreamController.class);

    @Autowired
    ObjectMapper mapper;
    
    // 以Token的方式解析JSON字符串
    @RequestMapping("/parser.html")
    public @ResponseBody String parser() throws JsonParseException, IOException{
        String json = "{\"name\":\"lijz\",\"id\":10}";
        JsonFactory f = mapper.getFactory(); 
        String key=null,value=null;
        JsonParser parser = f.createParser(json);
        // {
        JsonToken token  = parser.nextToken();
        //"name"
        token = parser.nextToken();
        if(token==JsonToken.FIELD_NAME){
            key = parser.getCurrentName();
            
        }
        
        token = parser.nextToken();
        //"lijz"
        value = parser.getValueAsString();
        parser.close();
        return key+","+value;
        
    }
    
    // 以Token的方式生成JSON字符串
    @RequestMapping("/generator.html")
    public @ResponseBody String generator() throws JsonParseException, IOException{
        JsonFactory f = mapper.getFactory(); 
        //输出到stringWriter
        StringWriter sw = new StringWriter();
        JsonGenerator g = f.createGenerator(sw);
        // {
        g.writeStartObject();
        
        // "message", "Hello world!"
        g.writeStringField("name", "lijiazhi");
        // }
        g.writeEndObject();
        g.close();
        return sw.toString();
    }
    
    

}













posted @ 2018-04-23 18:50  ParamousGIS  阅读(260)  评论(0编辑  收藏  举报