java - 使用 Gson 解析 JSON(或 java 的替代方案)

标签 java json rest gson

我使用 Gson 已经有一段时间了,但是这个让我摸不着头脑。这是我从 REST 调用返回的典型 json 响应。请注意,有多个相同类型的嵌套引用。知道如何使用 Gson (或另一个 java 库)解决这个问题,而无需进行字符串操作吗?

我尝试使用注释来声明相同的名称,但最终得到:

@SerializedName("Context")

declares multiple JSON fields named Context

"response": {
    "Context": {
        "Context": {
            "ttContext": [
                {
                    "taskId": "",
                    "name": "GUID",
                    "value": "abc123"
                }
            ]
        }
    },
    "Data": {
        "Data": {
            "ttData": [
                {
                    "name": "Bob Brown",
                    "address": "101 Anywhere St",
                    "city": "Spruce Pine",
                    "state": "AL",
                    "zipcd" : 12345
                }
            ]
        }
    }
}

最佳答案

下面我所做的是创建一个可以通过构造函数包含自身的 Java 类。

我实际上创建了一个 JUnit 测试。我还放置了所有的 getter/setter,因此对于这个论坛来说可能不必要地太长。抱歉。

import com.google.gson.Gson;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class TestThrowaway {

public class Container {
    Response response;

    public Container() {
    }

    public Response getResponse() {
        return response;
    }

    public void setResponse(Response response) {
        this.response = response;
    }
}

public class Response {
    private Context Context;
    private Data Data;

    public Response() {
    }

    public TestThrowaway.Context getContext() {
        return Context;
    }

    public void setContext(TestThrowaway.Context context) {
        Context = context;
    }

    public TestThrowaway.Data getData() {
        return Data;
    }

    public void setData(TestThrowaway.Data data) {
        Data = data;
    }
}

public class Context {
    private Context Context;
    private List<TtContext> ttContext;

    public Context() {}
    public Context(Context context) {
        this.Context = context;
    }

    public TestThrowaway.Context getContext() {
        return Context;
    }

    public void setContext(TestThrowaway.Context context) {
        Context = context;
    }

    public List<TtContext> getTtContext() {
        return ttContext;
    }

    public void setTtContext(List<TtContext> ttContext) {
        this.ttContext = ttContext;
    }
}

public class TtContext {
    private String taskId;
    private String name;
    private String value;

    public TtContext(String taskId, String name, String value) {
        this.taskId = taskId;
        this.name = name;
        this.value = value;
    }

    public TtContext() {
    }

    public String getTaskId() {
        return taskId;
    }

    public void setTaskId(String taskId) {
        this.taskId = taskId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

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

public class Data {
    private Data Data;
    private List<TtData> ttData;

    public Data() {
    }

    public Data(TestThrowaway.Data data) {
        Data = data;
    }

    public TestThrowaway.Data getData() {
        return Data;
    }

    public void setData(TestThrowaway.Data data) {
        Data = data;
    }

    public void setTtData(List<TtData> ttData) {
        this.ttData = ttData;
    }

}

public class TtData {
    private String name;
    private String address;
    private String city;
    private String state;
    private Integer zipcd;

    public TtData() {
    }

    public TtData(String name, String address, String city, String state, Integer zipcd) {
        this.name = name;
        this.address = address;
        this.city = city;
        this.state = state;
        this.zipcd = zipcd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public Integer getZipcd() {
        return zipcd;
    }

    public void setZipcd(Integer zipcd) {
        this.zipcd = zipcd;
    }
}

@Test
public void test() {
    // Create inner Context object
    Context innerContext = new Context();

    // Create your ttContext list. For ease, I created a constructor that takes in all of your values
    List<TtContext> ttContexts = new ArrayList<>();
    ttContexts.add(new TtContext("", "GUID", "abc123"));

    // Add your list to your inner Context
    innerContext.setTtContext(ttContexts);

    // Create a new Context object that takes in a Context object, the inner Context object
    Context outsideContext = new Context(innerContext);

    // Create inner Data object
    Data innerData = new Data();

    // Create your ttData list.
    List<TtData> ttDatas = new ArrayList<>();
    ttDatas.add(new TtData("Bob Brown", "101 Anywhere St", "Spruce Pine", "AL", 12345));

    // Add your list to your inner Data
    innerData.setTtData(ttDatas);

    // Create a new Data object that takes in a Data object, the inner Data object
    Data outsideData = new Data(innerData);

    // Create a Response object that will set both the outsideContext object and the outsideData object
    Response response = new Response();
    response.setContext(outsideContext);
    response.setData(outsideData);

    // If you leave like this and run Gson, you won't have the wrapping "response" object.  
    // I like to create a Container object that takes in the Response object so I can create a variable 
    // called response and Gson does everything for me.  

    Container container = new Container();
    container.setResponse(response);

    // Instantiate Gson and run the method toJson.
    Gson gson = new Gson();
    String s = gson.toJson(container);
    System.out.println(s);
}
}

测试结果为:

{
  "response": {
    "Context": {
      "Context": {
        "ttContext": [
          {
            "taskId": "",
            "name": "GUID",
            "value": "abc123"
          }
        ]
      }
    },
    "Data": {
      "Data": {
        "ttData": [
          {
            "name": "Bob Brown",
            "address": "101 Anywhere St",
            "city": "Spruce Pine",
            "state": "AL",
            "zipcd": 12345
          }
        ]
      }
    }
  }
}

关于java - 使用 Gson 解析 JSON(或 java 的替代方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29854657/

相关文章:

javascript - 使用 Javascript 连接 SVG 圆圈

c++ - 将 utf8 实体从 json 解码为 utf8 C++

php - 如何使用api获取从比特币到美元的价格

c# - 使 ASP.NET WCF 将字典转换为 JSON,省略 "Key"和 "Value"标记

java - 如何通过在android中捕获图像来保存图像到php?

java - 当文本区域不可编辑时按下按键如何在 jpanel 中显示只读消息文件?

node.js - 在需要客户端证书进行身份验证的 Node.js 中进行 REST 调用

java - 如何在使用 Jersey 时在界面上注释 JAX-RS

java - 枚举常量特定初始化

java - 在java中链接两个椭圆