避免使用Gson解析JSON子文档

时间:2015-11-30 12:22:00

标签: gson

假设有以下JSON文档:

{
  "id": "file",
  "value": "File",
  "popup": { /* complex object here */
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}

我只对idvalue感兴趣,并希望将popup存储为字符串,我将存储到数据库并在需要时稍后解析。

我试图将其解析为此类,但我收到错误:预期STRING但是BEGIN_OBJECT

class Object {
    @Expose String id;
    @Expose String value;
    @Expose String popup; 
}

Gson可以吗?

2 个答案:

答案 0 :(得分:0)

为什么不为弹出键获取JSONObject并将其转换为字符串?

JSONObject posts=new JSONObject(json);
String popup=posts.getJSONObject("popup").toString();

答案 1 :(得分:0)

在Gson中,每个JSON对象都被视为一个类,您将使用它来获取响应的便利类,以便您可以直接从json字符串填充对象,而不是进行循环的忙碌

我已经编写了一些测试类,可以帮助您获得正在寻找的输出,反之亦然。

  

MenuItem.java

import com.google.gson.annotations.SerializedName;

public class MenuItem {

    @SerializedName("value")
    private String value;

    @SerializedName("onclick")
    private String onclick;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getOnclick() {
        return onclick;
    }

    public void setOnclick(String onclick) {
        this.onclick = onclick;
    }
}
  

PopUp.java

import java.util.ArrayList;

import com.google.gson.annotations.SerializedName;

public class PopUp {

    @SerializedName("menuitem")
    private ArrayList<MenuItem> menuItems;

    public ArrayList<MenuItem> getMenuItems() {
        return menuItems;
    }

    public void setMenuItems(ArrayList<MenuItem> menuItems) {
        this.menuItems = menuItems;
    }
}
  

Response.java

import com.google.gson.annotations.SerializedName;

public class Response {

    @SerializedName("id")
    private String id;

    @SerializedName("value")
    private String value;

    @SerializedName("popup")
    private PopUp popup;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public PopUp getPopup() {
        return popup;
    }

    public void setPopup(PopUp popup) {
        this.popup = popup;
    }
}

不,我们有我们需要的类,我们将运行它来测试它是否按照测试代码

运行
  

PopUpTestDrive.java

import java.util.ArrayList;

import com.google.gson.Gson;

public class PopUpTestDrive {

    public static void main(String[] args) {

        ArrayList<MenuItem> menuItems = new ArrayList<>();

        for (int i = 0; i < 3; i++) {
            MenuItem item = new MenuItem();
            item.setOnclick("Onclick:_"+i);
            item.setValue("Value_"+i);

            menuItems.add(item);
        }

        PopUp popUp = new PopUp();
        popUp.setMenuItems(menuItems);

        Response response = new Response();
        response.setId("file");
        response.setValue("File");
        response.setPopup(popUp);

        String jsonResult = (new Gson()).toJson(response);
        System.out.println(""+jsonResult);

    }
}
  

输出

{
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {
        "value": "Value_0",
        "onclick": "Onclick:_0"
      },
      {
        "value": "Value_1",
        "onclick": "Onclick:_1"
      },
      {
        "value": "Value_2",
        "onclick": "Onclick:_2"
      }
    ]
  }
}