jackson 工具类

1.maven 依赖

		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.10.0</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.datatype</groupId>
			<artifactId>jackson-datatype-jsr310</artifactId>
			<version>2.10.0</version>
		</dependency>

2.JacksonUtil 工具类

package util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.JsonNodeType;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * jackson 工具类
 *
 * @author zhangjian
 * @version 1.0.0
 * @since 2021/09/21 15:19
 */
public class JacksonUtil {

  public static final ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());
  static {
    // 反序列化时忽略不存在的JavaBean属性:
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  }

  /** 工具类不允许外界创建对象 */
  private JacksonUtil() {
  }

  /**
   * 嵌套 JSONString 转 Map<String, String>
   */
  public static HashMap<String, String> parseJsonNode(String json) throws JsonProcessingException {
    HashMap<String, String> map = new HashMap<>();
    JsonNode jsonNode = mapper.readTree(json);
    parseJsonNode(jsonNode, map, "");
    return map;
  }

  private static void parseJsonNode(JsonNode jsonNode, Map<String, String> map, String key) {
    JsonNodeType nodeType = jsonNode.getNodeType();
    // 数组
    if (nodeType == JsonNodeType.ARRAY) {
      Iterator<JsonNode> elements = jsonNode.elements();
      int i = 0;
      while (elements.hasNext()) {
        parseJsonNode(elements.next(), map, key + String.format("[%d]", i++));
      }
    }
    // 对象
    else if (nodeType == JsonNodeType.OBJECT) {
      Iterator<Map.Entry<String, JsonNode>> fields = jsonNode.fields();
      while (fields.hasNext()) {
        Map.Entry<String, JsonNode> field = fields.next();
        parseJsonNode(field.getValue(), map, key + "." + field.getKey());
      }
    }
    // 数字 / 字符串
    else if(nodeType == JsonNodeType.NUMBER || nodeType == JsonNodeType.STRING){
      map.put(key, jsonNode.textValue());
    }else {
      throw new UnsupportedOperationException("unknown JsonNodeType");
    }
  }

  public static <T> T jsonToObject(String json, Class<T> t) throws JsonProcessingException {
    return mapper.readValue(json, t);
  }

  public static String objectToString(Object obj) throws JsonProcessingException {
    return mapper.writeValueAsString(obj);
  }

}

3.自定义序列化

package util;

import java.io.IOException;
import java.math.BigInteger;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

/**
 * 自定义序列化
 */
public class IsbnDeserializer extends JsonDeserializer<BigInteger> {

	@Override
	public BigInteger deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
		String s = p.getValueAsString();
		if (s != null) {
			try {
				return new BigInteger(s.replace("-", ""));
			} catch (NumberFormatException e) {
				throw new JsonParseException(p, s, e);
			}
		}
		return null;
	}
}

4.实体类

package bean;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.time.LocalDate;
import java.util.List;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import util.IsbnDeserializer;
import lombok.Data;

@Data
public class Book {

  private long id;

  private String name;

  private String author;

  @JsonDeserialize(using = IsbnDeserializer.class)
  private BigInteger isbn;

  private List<String> tags;

  private LocalDate pubDate;

  private BigDecimal price;
}

资源文件

book.json

{
    "id": 1,
    "name": "Java核心技术",
    "author": "Cay S. Horstmann",
    "isbn": "978-7-111-54742-6",
    "tags": ["Java", "Network"],
    "pubDate": "2016-09-01",
    "price": 119.5
}

albumList.json

{
  "id": 1,
  "name": "Java核心技术",
  "author": "Cay S. Horstmann",
  "isbn": "978-7-111-54742-6",
  "tags": ["Java", "Network", "spring"],
  "pubDate": "2016-09-01",
  "public": {
    "id": 1,
    "name": "Java核心技术",
    "author": "Cay S. Horstmann",
    "isbn": "978-7-111-54742-6",
    "tags": ["Java", "Network"],
    "pubDate": "2016-09-01",
    "price": {

    }
  }
}

参考:https://gitee.com/zhangjian-eng/jackson-util/blob/master/README.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值