Search code examples
javagson

Gson - parsing json with field that is array or string


I'm trying to parse some json with Gson and I have following problem:

This is my json:

[{
  "label": "Check Digit",
  "value": "W"
},
{
  "label": "Equipment",
  "value": [
    "With Standard Liftgate",
    "(-) Version Packages"
  ]
}]

This is my java class:

public class Decode {

    private String label;
    private List<String> value = new ArrayList<>();

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public List<String> getValue() {
        return value;
    }

    public void setValue(List<String> value) {
        this.value = value;
    }

}

How to make Gson to parse it and use value as Array of String always?


Solution

  • My suggestion is as follows:-

    Step 1: Please make following little changes to your Decode class.

    Decode.java

    import java.util.ArrayList;
    import java.util.List;
    
    public class Decode {
    
    private String label;
    private List<String> values = new ArrayList<>(); // in json it is "value"
    
    public String getLabel() {
        return label;
    }
    
    public void setLabel(String label) {
        this.label = label;
    }
    
    public List<String> getValues() {
        return values;
     }
    
    public void setValues(List<String> values) {
        this.values = values;
     }
    
    @Override
    public String toString() {
        return "Decode [label=" + label + ", values=" + values + "]";
     }
    
    }
    

    Step 2: Please create following JsonDeserializer.

    MyDeserializer.java

    import java.lang.reflect.Type;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.google.gson.Gson;
    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.reflect.TypeToken;
    
    public class MyDeserializer implements JsonDeserializer<Decode> {
    
    @Override
    public Decode deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
        JsonObject decodeObj = arg0.getAsJsonObject();
        Gson gson = new Gson();
        Decode decode = gson.fromJson(arg0, Decode.class);
        List<String> values = null;
        if (decodeObj.get("value").isJsonArray()) {
            values = gson.fromJson(decodeObj.get("value"), new TypeToken<List<String>>() {
            }.getType());
        } else {
            String single = gson.fromJson(decodeObj.get("value"), String.class);
            values = new ArrayList<String>();
            values.add(single);
        }
        decode.setValues(values);
        return decode;
     }
    
    }
    

    Step 3: Now its time to deserialize your json as follows:

    GsonMain.java

    import java.io.File;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.util.Arrays;
    
    import com.google.gson.GsonBuilder;
    
    public class GsonMain{
    public static void main(String[] args) throws IOException {
        String filename = "d:/test.json"; // contains the json
        String content = new String(Files.readAllBytes(new File(filename).toPath()));
    
        GsonBuilder b = new GsonBuilder();
        b.registerTypeAdapter(Decode.class, new MyDeserializer());
        Decode[] array = b.create().fromJson(content, Decode[].class);
        System.out.println(Arrays.toString(array));
      }
    
     }