【问题标题】:Deserialize complex JSON using Gson使用 Gson 反序列化复杂的 JSON
【发布时间】:2015-12-21 15:25:10
【问题描述】:

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

{
    item1:"text1"
    item2:{
        item3:"text3"
        item4:"text4"
    }
}

收件人:

class MyClass {
    String item1;  //item1 == "text1";
    String item4;  //item4 == "text4";
}

【问题讨论】:

  • 为什么 item2 和 item3 会从模式中消失,为什么 item4 会是主对象的直接子对象?你能准确描述一下你想要什么吗?

标签: java android json gson deserialization


【解决方案1】:

正确的模型是:

class MyClass {
    String item1;  
    Item2 item2;  
}

class Item2{
    String item3; 
    String item4;
}

【讨论】:

  • 是的,它是代表输入的完整模型,但如果 MyClass 无法修改怎么办?我相信这就是 OP 所要求的。
  • @Gaël 是的,在我看到你的回答之后,我认为可能是这种情况,这就是我支持你的原因。虽然我会把这个答案留在这里,以防他/她真的要模特:)
【解决方案2】:

如果您无法更改模型,即MyClass,则必须编写自定义反序列化程序。 例如,请参阅How do I write a custom JSON deserializer for Gson?

在你的情况下,它可能是这样的:

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

编辑:您不必手动反序列化所有内容,如果您有复杂的对象而不是 Strings,您仍然可以在这些对象上部分调用 Gson(如上面的链接中所述) .

【讨论】:

    【解决方案3】:

    像这样解析 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();
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      这篇文章可能会有所帮助..

      它有一个像这样解析复杂 JSON 的工作示例..

      { "pageInfo": { "pageName": "TheTestbook", "pagePic": "content.jpg" }, "posts": [{ "postId": "123456", "postName": "Java Post" }] }

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

      您可以在此处查看完整示例。 http://howtolearnjava.com/how-to-parse-json-in-java-marshaling-to-java-objects/

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
      • 感谢 Leigh 的建议,我现在已经包含了代码 sn-p。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 2017-07-04
      相关资源
      最近更新 更多