java序列化json对象_【json】使用json和java对象的序列化和反序列化

TOC

[[TOC]]

依赖

fastxml

Creating Java List from JSON Array String

String jsonCarArray =

"[{ \"color\" : \"Black\", \"type\" : \"BMW\" }, { \"color\" : \"Red\", \"type\" : \"FIAT\" }]";

List listCar = objectMapper.readValue(jsonCarArray, new TypeReference>(){});

Creating Java Map from JSON String

String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";

Map map = objectMapper.readValue(json, new TypeReference>(){});

Handling Collections

数组

String jsonCarArray =

"[{ \"color\" : \"Black\", \"type\" : \"BMW\" }, { \"color\" : \"Red\", \"type\" : \"FIAT\" }]";

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.configure(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, true);

Car[] cars = objectMapper.readValue(jsonCarArray, Car[].class);

// print cars

List

String jsonCarArray =

"[{ \"color\" : \"Black\", \"type\" : \"BMW\" }, { \"color\" : \"Red\", \"type\" : \"FIAT\" }]";

ObjectMapper objectMapper = new ObjectMapper();

List listCar = objectMapper.readValue(jsonCarArray, new TypeReference>(){});

// print cars

Dealing with Unknown Fields on the Class

@JsonIgnoreProperties(ignoreUnknown = true)

public class MyDtoIgnoreUnknown { ... }

Ignore Null Fields on the Class

@JsonInclude(Include.NON_NULL)

public class MyDto { ... }

属性上

public class MyDto {

@JsonInclude(Include.NON_NULL)

private String stringValue;

private int intValue;

// standard getters and setters

}

Ignore Null Fields Globally

mapper.setSerializationInclusion(Include.NON_NULL);

Change Name of Field for Serialization

@JsonProperty("strVal")

public String getStringValue() {

return stringValue;

}

Enum as Json Object

@JsonFormat(shape = JsonFormat.Shape.OBJECT)

public enum Distance { ... }

Enums and @JsonValue

public enum Distance {

...

@JsonValue

public String getMeters() {

return meters;

}

}

Use @JsonFormat to format Date

public class Event {

public String name;

@JsonFormat

(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")

public Date eventDate;

}

@Test

public void whenUsingJsonFormatAnnotationToFormatDate_thenCorrect()

throws JsonProcessingException, ParseException {

SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");

df.setTimeZone(TimeZone.getTimeZone("UTC"));

String toParse = "20-12-2014 02:30:00";

Date date = df.parse(toParse);

Event event = new Event("party", date);

ObjectMapper mapper = new ObjectMapper();

String result = mapper.writeValueAsString(event);

assertThat(result, containsString(toParse));

}

Serialize Joda-Time with Jackson

com.fasterxml.jackson.datatype

jackson-datatype-joda

2.4.0

@Test

public void whenSerializingJodaTime_thenCorrect()

throws JsonProcessingException {

DateTime date = new DateTime(2014, 12, 20, 2, 30,

DateTimeZone.forID("Europe/London"));

ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new JodaModule());

mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

String result = mapper.writeValueAsString(date);

assertThat(result, containsString("2014-12-20T02:30:00.000Z"));

}

Serialize Java 8 Date with Jackson

com.fasterxml.jackson.datatype

jackson-datatype-jsr310

2.4.0

@Test

public void whenSerializingJava8Date_thenCorrect()

throws JsonProcessingException {

LocalDateTime date = LocalDateTime.of(2014, 12, 20, 2, 30);

ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new JSR310Module());

mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

String result = mapper.writeValueAsString(date);

assertThat(result, containsString("2014-12-20T02:30"));

}

Deserialize Date

@Test

public void whenDeserializingDateWithJackson_thenCorrect()

throws JsonProcessingException, IOException {

String json = "{"name":"party","eventDate":"20-12-2014 02:30:00"}";

SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");

ObjectMapper mapper = new ObjectMapper();

mapper.setDateFormat(df);

Event event = mapper.readerFor(Event.class).readValue(json);

assertEquals("20-12-2014 02:30:00", df.format(event.eventDate));

}

Serialize Using JSON Views

public class Views {

public static class Public {

}

public static class Internal extends Public {

}

}

public class Item {

@JsonView(Views.Public.class)

public int id;

@JsonView(Views.Public.class)

public String itemName;

@JsonView(Views.Internal.class)

public String ownerName;

}

@Test

public void whenUsePublicView_thenOnlyPublicSerialized()

throws JsonProcessingException {

Item item = new Item(2, "book", "John");

ObjectMapper mapper = new ObjectMapper();

String result = mapper

.writerWithView(Views.Public.class)

.writeValueAsString(item);

assertThat(result, containsString("book"));

assertThat(result, containsString("2"));

assertThat(result, not(containsString("John")));

}

@Test

public void whenUseInternalView_thenAllSerialized()

throws JsonProcessingException {

Item item = new Item(2, "book", "John");

ObjectMapper mapper = new ObjectMapper();

String result = mapper

.writerWithView(Views.Internal.class)

.writeValueAsString(item);

assertThat(result, containsString("book"));

assertThat(result, containsString("2"));

assertThat(result, containsString("John"));

}

Deserialize Using JSON Views

@Test

public void whenUseJsonViewToDeserialize_thenCorrect()

throws IOException {

String json = "{"id":1,"name":"John"}";

ObjectMapper mapper = new ObjectMapper();

User user = mapper

.readerWithView(Views.Public.class)

.forType(User.class)

.readValue(json);

assertEquals(1, user.getId());

assertEquals("John", user.getName());

}

Using JSON Views with Spring

@JsonView(Views.Public.class)

@RequestMapping("/items/{id}")

public Item getItemPublic(@PathVariable int id) {

return ItemManager.getById(id);

}

{"id":2,"itemName":"book"}

@JsonView(Views.Internal.class)

@RequestMapping("/items/internal/{id}")

public Item getItemInternal(@PathVariable int id) {

return ItemManager.getById(id);

}

{"id":2,"itemName":"book","ownerName":"John"}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值