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

Java GSON反序列化/序列化层次结构类,java,json,gson,Java,Json,Gson,我有一个java应用程序,可以将json内容发送到我的服务器(c++)。我在我的服务器上接收json,进行解析、验证等,并用json返回响应。 我的java应用程序中有一个请求具有此json主体(示例): 但是对于同一个命令,我可以使用其他搜索方法: { "a": "a", "b": "b", "searchMethod": { "searchByEmail": { "email": "user@user.com"

我有一个java应用程序,可以将json内容发送到我的服务器(c++)。我在我的服务器上接收json,进行解析、验证等,并用json返回响应。 我的java应用程序中有一个请求具有此json主体(示例):

但是对于同一个命令,我可以使用其他
搜索方法

{
    "a": "a",
    "b": "b",
    "searchMethod": {
        "searchByEmail": {
            "email": "user@user.com"
        }
    }
}
因此,当用户执行请求时,我们可以向我的服务器发送这两个不同json主体中的一个。我从来不知道我们发送了什么
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;
        }
    }
}
我已经实现了
a
b
字段,因为它在这个请求中总是相同的。在这个类中,
fromStringJson(字符串数据)
接收包含用户尝试发送的所有json的数据字符串字段。在这个函数中,我使用
gson.fromJson
将这个字符串转换为我的
RequestExample
类的json对象类型


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

如果您不使用field
searchMethod
,您可以像地图一样实现它

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<>();
private Map searchMethod=new HashMap();
或
私有映射searchMethod=newhashmap();
或
私有映射searchMethod=newhashmap();

谢谢您的回复。我理解你的密码,但我有一个疑问。目标是什么?按用户搜索还是按电子邮件搜索?在这个地图中,我需要定义一些对象,但我不知道用户选择的对象类型。你明白我的怀疑吗?同一命令可以使用searchByUser或searchByEmail。。当我收到字符串数据时,我不知道用户使用了什么搜索方法。我不需要用户java层次结构。我只能使用这样的映射:map searchMethod,因为我在服务器中对json内容进行了赋值。通过这种方式,我可以发送搜索方法,在C++服务器内部解析JSON并做验证:)我理解了,你找到了解决方案,所以我编辑了其他人的答案,谢谢你的帮助;
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<>();