Skip to content

@JsonAdapter + JsonDeserializer make JsonSerializer fail #1783

@DoneSpeak

Description

@DoneSpeak

I want to deserialize the string to list so I use @JsonAdapter + JsonDeserializer to solve the problem, but when I try to serialize the List, I get a {}.

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;

import com.google.gson.JsonPrimitive;
import com.google.gson.annotations.JsonAdapter;
import lombok.Data;

public class Temp {

    @Data
    public static class DataValue {
        @JsonAdapter(ListDeserializer.class)
        private List<String> list;
    }

    public static class ListDeserializer implements JsonDeserializer<List<String>> {

        @Override
        public List<String> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
            if(json.isJsonNull()) {
                return null;
            }
            if (json.isJsonNull()) {
                return null;
            }
            if (json.isJsonArray()) {
                Iterator<JsonElement> iter = json.getAsJsonArray().iterator();
                final List<String> result = new ArrayList<>();
                iter.forEachRemaining(e -> result.add(e.getAsString()));
                return result;
            }
            if (json.isJsonPrimitive()) {
                JsonPrimitive jsonPrimitive = (JsonPrimitive) json;
                String str = jsonPrimitive.getAsString();
                return Arrays.asList(str.split(","));
            }
            return null;
        }
    }

    public static void main(String[] args) {
        GsonBuilder gsonBuilder = new GsonBuilder();
        // gsonBuilder.setPrettyPrinting();
        Gson gson = gsonBuilder.create();

        String json = "{\"list\":\"a,b,c,d,e,f\"}";
        DataValue dataValue = gson.fromJson(json, DataValue.class);
        // Temp.DataValue(list=[a, b, c, d, e, f])
        System.out.println(dataValue);
        // {"list":{}}
        System.out.println(gson.toJson(dataValue));
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions