Coder Social home page Coder Social logo

blog's People

Watchers

Mirko avatar

blog's Issues

如何优雅的使用Jackson

反序列化(JSON映射到Java对象)

字符串转Java对象

ObjectMapper objectMapper = new ObjectMapper();
String carJson ="{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
Car car = objectMapper.readValue(carJson, Car.class);

字符串数据流转Java对象

ObjectMapper objectMapper = new ObjectMapper();
String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 4 }";
Reader reader = new StringReader(carJson);
Car car = objectMapper.readValue(reader, Car.class);

存储在文件中的JSON转Java对象

ObjectMapper objectMapper = new ObjectMapper();
File file = new File("data/car.json");
Car car = objectMapper.readValue(file, Car.class);

URL 转Java对象

ObjectMapper objectMapper = new ObjectMapper();
URL url = new URL("file:data/car.json");
Car car = objectMapper.readValue(url, Car.class);

JSON字节输入流转Java对象

String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";
ObjectMapper objectMapper = new ObjectMapper();
Car[] cars2 = objectMapper.readValue(jsonArray, Car[].class);

JSON二进制数组转Java对象

ObjectMapper objectMapper = new ObjectMapper();
String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
byte[] bytes = carJson.getBytes("UTF-8");
Car car = objectMapper.readValue(bytes, Car.class);

JSON数组字符串转Java对象数组

String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";
ObjectMapper objectMapper = new ObjectMapper();
Car[] cars2 = objectMapper.readValue(jsonArray, Car[].class);

JSON数组字符串转List

String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";
ObjectMapper objectMapper = new ObjectMapper();
List<Car> cars1 = objectMapper.readValue(jsonArray, new TypeReference<List<Car>>(){});

JSON字符串转Map

String jsonObject = "{\"brand\":\"ford\", \"doors\":5}";
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> jsonMap = objectMapper.readValue(jsonObject,new TypeReference<Map<String,Object>>(){});

序列化(Java对象映射到JSON)

Java对象转JSON字符串

  ObjectMapper objectMapper = new ObjectMapper();
  Car car = new Car();
  car.setBrand("宝马");
  car.setDoors(4);
  String json = objectMapper.writeValueAsString(car);
  System.out.println(json);

日期转换

Date 类型默认会转成long类型时间戳

Date对象转String

  Transaction transaction = new Transaction("transfer", new Date());
  ObjectMapper objectMapper = new ObjectMapper();
  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  objectMapper.setDateFormat(dateFormat);
  String output2 = objectMapper.writeValueAsString(transaction);
  System.out.println(output2);

Jsckson JSON树模型

JsonNode是不可变的,只能获取数据读,不能进行写,如果需要改变树结构,就需要创建ObjectNode来进行改变。

JSON 转 JsonNode

  String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
  ObjectMapper objectMapper = new ObjectMapper();
  try {
      JsonNode jsonNode = objectMapper.readValue(carJson, JsonNode.class);
      //使用ObjectMapper readTree()方法将JSON解析为JsonNode
      JsonNode jsonNode = objectMapper.readTree(carJson);
  } catch (IOException e) {
      e.printStackTrace();
  }

Java对象转JsonNode

ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car();
car.brand = "Cadillac";
car.doors = 4;
JsonNode carJsonNode = objectMapper.valueToTree(car);

JsonNode转Java对象

ObjectMapper objectMapper = new ObjectMapper();
String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
JsonNode carJsonNode = objectMapper.readTree(carJson);
Car car = objectMapper.treeToValue(carJsonNode);

JsonNode 获取元素

无论是单个元素,数组还是对象,都可以用get来获取
String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 5," +
        "  \"owners\" : [\"John\", \"Jack\", \"Jill\"]," +
        "  \"nestedObject\" : { \"field\" : \"value\" } }";

ObjectMapper objectMapper = new ObjectMapper();
try {
    JsonNode jsonNode = objectMapper.readValue(carJson, JsonNode.class);
    //获取字符串类型单个元素
    JsonNode brandNode = jsonNode.get("brand");
    String brand = brandNode.asText();
    System.out.println("brand = " + brand);
    //获取Int类型单个元素
    JsonNode doorsNode = jsonNode.get("doors");
    int doors = doorsNode.asInt();
    System.out.println("doors = " + doors);
    //获取数组类型的元素
    JsonNode array = jsonNode.get("owners");
    JsonNode jsonNode = array.get(0);
    String john = jsonNode.asText();
    System.out.println("john  = " + john);
    //获取嵌套对象的数据
    JsonNode child = jsonNode.get("nestedObject");
    JsonNode childField = child.get("field");
    String field = childField.asText();
    System.out.println("field = " + field);
    //获取子路径下的数据 如果没有匹配到则返回null
    JsonNode nameNode = jsonNode.at("/nestedObject/field");
} catch (IOException e) {
    e.printStackTrace();
}

基础元素数据类型

String f2Str = jsonNode.get("f2").asText();
double f2Dbl = jsonNode.get("f2").asDouble();
int    f2Int = jsonNode.get("f2").asInt();
long   f2Lng = jsonNode.get("f2").asLong();

默认值转换

如果找到对应字段,但是字段的值为null,可设置返回默认值。
不适应于没有找到字段的情况,因为这样get()方法会直接返回nullasText无法进行调用。
ObjectMapper objectMapper = new ObjectMapper();
String json = "{ \"f1\":\"Hello\", \"f2\":null }";
JsonNode jsonNode = objectMapper.readTree(json);
String f2Value = jsonNode.get("f2").asText("Default");

ObjectNode详解

ObjectNode属于JsonNode的子类,所以JsonNode的功能,ObjectNode都可以使用。
创建ObjectNode
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode objectNode = objectMapper.createObjectNode();
Set设置字段
将名称StringJsonNode作为参数传递,下面是JacksonObjectNode上设置字段的示例。
parentNode.set("child1", JsonNode);
parentNode.set("child1", ObjectNode);
Put设置字段
直接设置String类型的字段数据
objectNode.put("field1", "value1");
PutArray设置数组
ArrayNode nodes = objectNode.putArray("sonArray");
nodes.add(JsonNode);
nodes.add(ObjectNode);
删除字段
objectNode.remove("fieldName");
JsonObjectObjectNode
ObjectNode jsonNodes = jsonNode.deepCopy();

开关设置

ObjectMapper objectMapper = new ObjectMapper();
//忽略位置的JSON字段
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//不允许基本类型为null
objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, true);
//时间类型数据转换
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
objectMapper.setDateFormat(dateFormat);

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.