https://json-schema.org/learn/getting-started-step-by-step#defining-the-properties
- Jackson
- Gson
Details
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import com.google.gson.annotations.SerializedName;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.Objects;
import java.util.stream.Collectors;
public enum Status {
// GSON Json Serialization Setting
@SerializedName(value = "0", alternate = {"CREATED"})
CREATED(0),
@SerializedName(value = "1", alternate = {"UPDATED"})
UPDATED(1),
@SerializedName(value = "2", alternate = {"ACCEPTED"})
ACCEPTED(2),
@SerializedName(value = "3", alternate = {"COMPLETED"})
COMPLETED(3),
@SerializedName(value = "4", alternate = {"DESTROYED"})
DESTROYED(4),
@SerializedName(value = "5", alternate = {"NORMAL_STATUS"})
NORMAL_STATUS(5){
@Override
public EnumSet<Status> getRelatedEnumSet() {
return EnumSet.of(ACCEPTED, COMPLETED);
}
},
@SerializedName(value = "6", alternate = {"ALL"})
ALL(6) {
@Override
public EnumSet<Status> getRelatedEnumSet() {
return EnumSet.range(CREATED, DESTROYED);
}
};
private final int code;
static {
assert Arrays.stream(Status.values())
.mapToInt(Status::getCode)
.boxed()
.collect(Collectors.toSet()).size() == Status.values().length;
}
public static EnumSet<Status> getAllStatus() {
return EnumSet.range(CREATED, DESTROYED);
}
public static Status valueOf(Integer stausCode) {
return Arrays.stream(Status.values())
.filter(status -> Objects.equals(status.code, stausCode))
.findAny().orElse(null);
}
public static boolean isValidStatusCode(Integer stausCode) {
if (stausCode == null)
return false;
return valueOf(stausCode) != null;
}
@JsonCreator // Jackson Json Deserialization
public static Status fromJson(String jsonString) {
try {
Integer statusCode = Integer.valueOf(jsonString);
return valueOf(statusCode);
} catch (NumberFormatException e) {
return valueOf(jsonString);
}
}
Status(int code) {
this.code = code;
}
@JsonValue // Jackson Json Serialization Setting
public int getCode() {
return code;
}
public EnumSet<Status> getRelatedEnumSet() {
return EnumSet.of(this);
}
public String toJsonString() {
return String.valueOf(code);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Status{");
sb.append("code=").append(code);
sb.append('}');
return sb.toString();
}
}
Test Code
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.EnumSource;
import org.junit.jupiter.params.provider.MethodSource;
import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import static org.assertj.core.api.Assertions.assertThat;
public class StatusTest {
static Stream<Arguments> statusNameStringStream() {
return Arrays.stream(Status.values())
.map(Status::name)
.map(name -> String.format("\"%s\"", name))
.map(Arguments::of);
}
static IntStream statusCodeIntStream() {
return Arrays.stream(Status.values())
.mapToInt(Status::getCode);
}
static Stream<Arguments> statusCodeIntegerStream() {
return statusCodeIntStream()
.boxed()
.map(Arguments::of);
}
static Stream<Arguments> statusCodeStringStream() {
return Stream.concat(
statusCodeIntStream()
.mapToObj(code -> String.format("\"%d\"", code))
.map(Arguments::of),
statusCodeIntStream()
.mapToObj(String::valueOf)
.map(Arguments::of)
);
}
static Stream<Arguments> statusJsonStringStream() {
return Stream.concat(statusCodeStringStream(), statusNameStringStream());
}
@ParameterizedTest
@EnumSource(Status.class)
void testJsonSerializationByGson(Status status) {
String jsonString = new Gson().toJson(status);
System.out.println(jsonString);
assertThat(jsonString)
.isNotBlank();
assertThat(new Gson().fromJson(jsonString, String.class))
.isNotBlank();
}
@ParameterizedTest
@EnumSource(Status.class)
void testJsonSerializationByJackson(Status status) throws JsonProcessingException {
String jsonString = new ObjectMapper().writeValueAsString(status);
System.out.println(jsonString);
assertThat(jsonString)
.isNotBlank();
assertThat(Integer.valueOf(jsonString)).isNotNull();
}
@ParameterizedTest
@MethodSource("statusJsonStringStream")
void testJsonDeserializationByGson(String jsonString) {
Status status = new Gson().fromJson(jsonString, Status.class);
System.out.println(jsonString);
assertThat(status)
.isNotNull()
.isInstanceOf(Status.class);
}
@ParameterizedTest
@MethodSource("statusJsonStringStream")
void testJsonDeserializationByJackson(String jsonString) throws JsonProcessingException {
Status status = new ObjectMapper().readValue(jsonString, Status.class);
System.out.println(jsonString);
assertThat(status)
.isNotNull()
.isInstanceOf(Status.class);
}
}
https://support.smartbear.com/alertsite/docs/monitors/api/endpoint/jsonpath.html
https://www.44bits.io/ko/post/cli_json_processor_jq_basic_syntax
https://www.44bits.io/ko/post/cli_json_processor_jq_basic_syntax