GSON反序列化/序列化层次结构类

时间:2017-07-03 11:04:05

标签: java json gson

我有一个java应用程序将json内容发送到我的服务器(c ++)。我的服务器我收到了json,进行解析,验证等,并用json发回响应。 我的java应用程序中有一个请求有这个json正文(例子):

{
    "a": "a",
    "b": "b",
    "searchMethod": {
        "searchByUser": {
            "userId": "userId"
        }
    }
}

但是对于同样的命令我可以有其他searchMethod

{
    "a": "a",
    "b": "b",
    "searchMethod": {
        "searchByEmail": {
            "email": "user@user.com"
        }
    }
}

因此,当用户执行请求时,我们可以将这两个不同的json bodys中的一个发送到我的服务器。我永远不知道我们发送了什么searchMethod。这部分(检查用户发送的searchMethod等),当我收到json时,我在我的c ++服务器中执行此操作。所以在我的java应用程序中,我只需要使用gson发送一个searchMethod对象及其内容。

这是我的班级要求:

public class RequestExample implements SerializableJSON
{
    public String a;
    public String b;

    public RequestExample(String a, b)
    {
        this.a = a;
        this.b = b;
    }

    public static RequestExample fromStringJson(String data)
    {
        try
        {
            Gson gson = new Gson();
            return gson.fromJson(data, RequestExample.class);
        }
        catch(Exception e)
        {
            return null;
        }
    }

    public static RequestExample fromBytesJson(byte[] data)
    {
        if (data == null) return null;
        try 
        {
            String str = new String(data, "utf-8");
            return fromStringJson(str); 
        }
        catch (Exception e) 
        {
            return null;
        }
    }

    @Override
    public String toJsonString()
    {
        try
        {
            Gson gson = new Gson();
            return gson.toJson(this);
        }
        catch(Exception e)
        {
            return null;
        }
    }

    @Override
    public byte[] toJsonBytes()
    {
        try 
        {
            return this.toJsonString().getBytes("utf-8");
        }
        catch (Exception e)
        {
            return null;
        }
    }
}

我已经实现了字段ab,因为它在此请求中始终相同。在此类中,fromStringJson(String data)接收包含用户尝试发送的所有json的数据字符串字段。在这个函数中,我使用gson.fromJson将此字符串转换为我的RequestExample类的json对象类型。

所以主要问题是:如何调整我的RequestExample类以将字符串转换为json对象,而不管searchMethod的类型如何。就像我在我的java应用程序中说的,我不需要知道用户选择seachMethod的方式。在我的服务器中是的,但这部分我已经实现了。所以现在,我只需要将请求发送到我的服务器。

1 个答案:

答案 0 :(得分:1)

如果您不使用字段searchMethod,则可以像Map

一样实施
private Map<String, Object> searchMethod = new HashMap<>();

or

private Map<String, Map<String,Object>> searchMethod = new HashMap<>();

or

private Map<String, Map<String,String>> searchMethod = new HashMap<>();