Java 使用Gson反序列化复杂的JSON
可以像这样使用Gson反序列化复杂的JSON吗Java 使用Gson反序列化复杂的JSON,java,android,json,gson,deserialization,Java,Android,Json,Gson,Deserialization,可以像这样使用Gson反序列化复杂的JSON吗 { item1:"text1" item2:{ item3:"text3" item4:"text4" } } 致: 正确的模式是: class MyClass { String item1; Item2 item2; } class Item2{ String item3; String item4; } 如果您无法更改模型,即MyClass,
{
item1:"text1"
item2:{
item3:"text3"
item4:"text4"
}
}
致:
正确的模式是:
class MyClass {
String item1;
Item2 item2;
}
class Item2{
String item3;
String item4;
}
如果您无法更改模型,即
MyClass
,则必须编写自定义反序列化程序。
例如,见
在您的情况下,可能是这样的:
@Override
public MyClass deserialize(JsonElement json, Type type,
JsonDeserializationContext context) throws JsonParseException {
JsonObject jobject = json.getAsJsonObject();
String item1 = jobject.get("item1").getAsString();
String item4 = jobject.get("item2").getAsJsonObject().get("item4").getAsString(); // TODO check for NPE
return new MyClass(item1, item4);
}
EDIT:您不必手动反序列化所有内容,如果您拥有的不是
String
s的复杂对象,您仍然可以在这些对象上部分调用Gson(如上面的链接所述)。像这样解析JSON应该不会太困难。我会这样做的
public void parseJSON(JSONObject input) {
MyClass myClass = new MyClass(jsonObject);
}
public class MyClass {
public JSONObject jsonObject;
public String item1;
public String item3;
public String item4;
public MyClass(JSONObject jsonObject) {
this.jsonObject = jsonObject;
parseInput();
}
public void parseInput() {
try {
item1 = (String) jsonObject.get("item1");
JSONObject obj2 = (JSONObject) jsonObject.get("item2");
item3 = (String) obj2.get("item3");
item4 = (String) obj2.get("item4");
Log.d("OUTPUT", item1+", "+item3+", "+item4);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
这篇文章可能会有帮助 它有一个解析复杂JSON的工作示例,如下所示 {“pageInfo”:{“pageName”:“测试手册”,“pagePic”:“content.jpg”},“posts”:[{“postId”:“123456”,“postName”:“Java Post”}]} 您可以在这里看到完整的示例。。
为什么item2和item3会与模式分离,为什么item4会是主对象的直接子对象?你能准确描述一下你想要什么吗?是的,它是表示输入的完整模型,但是如果
MyClass
无法修改怎么办?我相信这就是OP所要求的。@Gaël是的,在我看到你的答案后,我认为可能是这样的,这就是为什么我高估了你。虽然我会在这里留下这个答案,以防他/她真的在问模型:)虽然这个链接可以回答这个问题,但最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,只有链接的答案可能会无效。谢谢Leigh的建议,我现在已经包含了代码片段。
public void parseJSON(JSONObject input) {
MyClass myClass = new MyClass(jsonObject);
}
public class MyClass {
public JSONObject jsonObject;
public String item1;
public String item3;
public String item4;
public MyClass(JSONObject jsonObject) {
this.jsonObject = jsonObject;
parseInput();
}
public void parseInput() {
try {
item1 = (String) jsonObject.get("item1");
JSONObject obj2 = (JSONObject) jsonObject.get("item2");
item3 = (String) obj2.get("item3");
item4 = (String) obj2.get("item4");
Log.d("OUTPUT", item1+", "+item3+", "+item4);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
public class JavaJsonSerializer {
public static void main(String[] args) {
String jsonString = "{ \"pageInfo\": { \"pageName\": \"TheTestbook\", \"pagePic\": \"content.jpg\" },"
+ " \"posts\": [{ \"postId\": \"123456\", \"postName\": \"Java Post\" }]}";
Gson gson = new Gson();
BlogPost blogPost = gson.fromJson(jsonString, BlogPost.class);
System.out.println(blogPost);
}
}