Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Gson反序列化复杂的JSON_Java_Android_Json_Gson_Deserialization - Fatal编程技术网

Java 使用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,

可以像这样使用Gson反序列化复杂的JSON吗

{
    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);
 }

}