如何使用GSON反序列化? (摆脱List <stringmap>)</stringmap>

时间:2014-01-21 16:19:53

标签: java json deserialization gson

我有jsons喜欢:

{ 
    "id":  "AnId",
    "type": "Button",
    "parameter": {
        "text" : "TestText"
    }
}

参数可以是任何结构,它们也可以包含其他json对象或数组,例如:

{ 
    "id":  "AnId",
    "type": "RadioGroup",
    "parameter": {
         "groupname": "AGroupName",
         "selected": "r2",
         "radioboxes": [
              {
                   "id": "r1",
                   "label": "radio1"
              },
              {
                   "id": "r2",
                   "label": "radio2"
              }
         ]
    }
}

但是,根据类型,可以知道参数是什么样的,例如

public class RadioGroup {
    private String groupName;
    // ..other primitive attributes here..
    private Map<String, RadioBox> radioBoxes;
    // ... getters/setters
}

public class RadioBox {
  private String id;

  private String label;
  // ... getter/setters
}

但是在我反序列化之前我不知道它的类型!

我想知道什么是反序列化输入的最佳方法,我不知道是否得到按钮或无线电组json?

到目前为止,我只是将给定的输入(按钮或复选框,尚未知)反序列化为Map<String, Object>,如果它实际上是按钮它工作正常,但如果我提供放射组作为输入,我将得到gson的放射性物质的内部类型ArrayList<StringMap>。像groupName这样的原始参数很好(String.class)。但是,对于radioboxes参数,我该怎样做才能获得List<Map<String,Radiobox>>而不是ArrayList<StringMap>

2 个答案:

答案 0 :(得分:0)

您需要设置您正在使用的自定义类的类型。这是序列化(只是一个例子):

    Gson gson = new GsonBuilder().create()
    Type aType = new TypeToken</ClassName/>() {}.getType();     
    String json = gson.toJson(this, aType);
然后,gson将正确转换变量类型。如果您使用自定义类作为变量,则需要编写自定义类型适配器并使用GsonBuilder()实例注册类型适配器。

要进行反序列化,您需要使用相同的过程。

修改

    Class<?> klass = null;
    try {
        klass = Class.forName(className);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        throw new JsonParseException(e.getMessage());
    }

答案 1 :(得分:0)

你可以使用GSON JsonDeserializer解析任意json。我已经为RadioGroup写了模型类,但你可以根据需要改变它。

public class RadioGroup {
  private String id;
  private String type;
  // You can put groupName and selected properties into other class, 
  private String groupname;
  private String selected;
  // for button param parsing into Map
  private Map<String,String> btnParam;
  // for radion Btn just parsing into List
  private List<RadioBox> radioboxes;
}

public class CustomDeserializer implements JsonDeserializer<RadioGroup> {

        @Override
        public RadioGroup deserialize(JsonElement json, Type arg1,
                JsonDeserializationContext arg2) throws JsonParseException {

            final JsonObject jsonObject = json.getAsJsonObject();
            final String id= jsonObject.get("id").getAsString();
            final String type= jsonObject.get("type").getAsString();
            final RadioGroup radioGroup = new RadioGroup();

            radioGroup.setId(id);
            radioGroup.setType(type);

            JsonElement jsonElementForParam = jsonObject.get("parameter");
            JsonElement jsonElementForText = jsonElementForParam.getAsJsonObject().get("text");

            if(null==jsonElementForText){
                String groupname = jsonElementForParam.getAsJsonObject().get("groupname").getAsString();
                String selected = jsonElementForParam.getAsJsonObject().get("selected").getAsString();
                JsonElement jsonElementForRadioboxes = jsonElementForParam.getAsJsonObject().get("radioboxes");

                radioGroup.setSelected(selected);
                radioGroup.setGroupname(groupname);

                Gson gson = new Gson();
                Type typeOf = new TypeToken<List<RadioBox>>(){}.getType();  
                List<RadioBox> radioboxes =gson.fromJson(jsonElementForRadioboxes, typeOf);
                radioGroup.setRadioboxes(radioboxes);


            } else if (null!=jsonElementForText) {
                Gson gson = new Gson();
                Type typeOf = new TypeToken<Map<String,String>>(){}.getType();  
                Map<String,String> map = gson.fromJson(jsonElementForParam, typeOf);
                radioGroup.setBtnParam(map);

            }

            return radioGroup;
        }
      }

最后解析它

GsonBuilder gsonBuilder = new GsonBuilder();
   gsonBuilder.registerTypeAdapter(RadioGroup.class, new CustomDeserializer());
   Gson gson = gsonBuilder.create();
   RadioGroup radioGroup = gson.fromJson(buttonJson, RadioGroup.class);