Skip to content

Instantly share code, notes, and snippets.

@rolroralra
Last active August 16, 2022 08:10
Show Gist options
  • Save rolroralra/7316ac3caef62679d1888490c922b270 to your computer and use it in GitHub Desktop.
Save rolroralra/7316ac3caef62679d1888490c922b270 to your computer and use it in GitHub Desktop.
JSON

JSON Schema

https://json-schema.org/learn/getting-started-step-by-step#defining-the-properties


Jsonnet

https://jsonnet.org/


Json Serialization & Deserialization

  • 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);
    }
}	  


JsonPath CheatSheet

https://support.smartbear.com/alertsite/docs/monitors/api/endpoint/jsonpath.html

https://www.44bits.io/ko/post/cli_json_processor_jq_basic_syntax


jq

https://www.44bits.io/ko/post/cli_json_processor_jq_basic_syntax

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment