我有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>
?
答案 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);