Java GSON对象(RESTful api)

Java GSON对象(RESTful api),java,c++,json,rest,gson,Java,C++,Json,Rest,Gson,我有一个客户端(java),它将一些json数据发送到我的服务器(c++)。在此之后,我的服务器会根据java客户机的操作响应一些信息。目前,它的工作 Example body request: { "userEmail": "email@email.com", "userPassword": "12345678" } 和服务器,接收电子邮件和密码,执行操作并返回响应 但现在我需要更改java客户端以发送如下请求: { "userInformation":{ "

我有一个客户端(java),它将一些json数据发送到我的服务器(c++)。在此之后,我的服务器会根据java客户机的操作响应一些信息。目前,它的工作

Example body request:
{
   "userEmail": "email@email.com",
   "userPassword": "12345678"
}
和服务器,接收电子邮件和密码,执行操作并返回响应

但现在我需要更改java客户端以发送如下请求:

{
  "userInformation":{
        "userEmail": "email@email.com",
        "userPassword": "12345678"
  }

}
public class LoginRequestArgs {

    public UserInfo userInformation;

    public LoginRequestArgs(String userEmail, String userPassword) {
        userInformation = new UserInfo(userEmail, userPassword);
    }

    static class UserInfo {
        public String userEmail;
        public String userPassword;

        public UserInfo(String userEmail, String userPassword) {
            this.userEmail = userEmail;
            this.userPassword = userPassword;
        }
    }

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

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

}
此请求可用于登录。这是一个非常复杂的体系结构,所以我不能复制所有的代码,但是在登录类中我使用GSON(注:我只在C++服务器中工作,我不在客户端工作,它不可能联系java客户端来询问他这个疑惑)

Java客户端登录类

public final String userEmail;
public final String userPassword;


public LoginRequestArgs( String userEmail, String userPassword)
{
    this.userEmail = userEmail;
    this.userPassword = userPassword;       
}

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

public static LoginRequestArgs 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;
    }
}
我有其他类连接到我的服务器并发送请求。此类调用login函数(请求是一个SerializableJSON变量),并将此请求放置到我的服务器
request=loginRequestStargs.fromStringJson(args.httpEntity)

(对于测试,我使用一个rest客户端chrome扩展)

我知道这很难理解,但要解释所有的事情并不容易。我试图解释本质

真正的问题是:我无法使java客户端发送“userInformation”中的电子邮件和密码。有人能帮我吗?谢谢

编辑(其他正文请求示例):

编辑2(身份验证方法):

编辑3(令牌):

编辑4:

{
  "sessionId":{
    "email":"email@email.com",
    "password":"dasdas"

  },
  "userInformation":{
        "userId": "userId1",
        "userPassword": "12345678"
  }

}

我已经把这个JSON发送到我的C++服务器,它的工作和解码会话ID也工作,这对我来说C++工作不是问题。但是我需要发送sessionId(或token),但在“AuthenticationMethod”中,这是我现在唯一需要实现的东西。注意“userInformation”及其类似的示例,例如“bookInformation”、“carInformation”,根据请求类型,我发送不同的数据,其中包含不同的键/值。。但在所有请求中都必须使用身份验证方法(会话id或令牌)

为了像我向您展示的那样工作,我实现了以下几点:

public class SessionId {

    public String email;
    public String password;

    public SessionId(String email, String password)
    {
        this.email = email;
        this.password = password;
    }

}
在我的类的构造中(例如,可以是一个类,如LoginRequestStargs、login cass),我称之为super:

public UserInfo userInformation;
public SessionId sessionId;

public LoginRequestArgs(String email, String password,String userEmail, String userPassword)
    {   
        super(email,password);
        userInformation = new UserInfo(userEmail, userPassword);
    }


static class UserInfo {
        public String userId;
        public String userPassword;

        public UserInfo(String userEmail, String userPassword) {
            this.userId = userEmail;
            this.userPassword = userPassword;
        }
    }
所以现在,我只需要在会话id或令牌之前添加“authenticationMethod”(我相信这样做的方法对两者都是一样的)

****编辑5********

login.java

public class LoginRequestArgs implements SerializableJSON  {

    public UserInfo userInformation;
    public AuthenticationMethod authenticationMethod;

    public LoginRequestArgs(String email, String password,String userId, String userPassword)
    {   
        AuthenticationMethod auth = new SessionId(email, password);
        setAuth(auth);
        userInformation = new UserInfo(userId, userPassword);
    }

    public void setAuth(AuthenticationMethod authenticationMethod){
            this.authenticationMethod = authenticationMethod;
    }

    static class UserInfo {
        public String userId;
        public String userPassword;

        public UserInfo(String userEmail, String userPassword) {
            this.userId = userEmail;
            this.userPassword = userPassword;
        }
    }
SessionId.java

public class SessionId extends AuthenticationMethod {

    Session sessionId;

     public SessionId(String email, String password)
     {
         this.sessionId = new Session(email,password);

     }

     static class Session{
         String email;
         String password;

         public Session(String email, String password)
         {
             this.email = email;
             this.password = password;
         }

     }
}
AuthenticationMethod.java

public class AuthenticationMethod {


}

您需要将
loginRequestStargs
类更改为如下所示:

{
  "userInformation":{
        "userEmail": "email@email.com",
        "userPassword": "12345678"
  }

}
public class LoginRequestArgs {

    public UserInfo userInformation;

    public LoginRequestArgs(String userEmail, String userPassword) {
        userInformation = new UserInfo(userEmail, userPassword);
    }

    static class UserInfo {
        public String userEmail;
        public String userPassword;

        public UserInfo(String userEmail, String userPassword) {
            this.userEmail = userEmail;
            this.userPassword = userPassword;
        }
    }

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

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

}
以下是您访问电子邮件和密码的方式:

loginRequestArgsInstance.userInformation.userEmail;
loginRequestArgsInstance.userInformation.userPassword;
您可能应该向这个类添加一些getter和setter,或者至少确保
userInformation
不是
null

有多种方法可以将会话细节包含到JSON中。一种方法是修改java类。大概是这样的:

{
  "userInformation":{
        "userEmail": "email@email.com",
        "userPassword": "12345678"
  }

}
public class LoginRequestArgs {

    public UserInfo userInformation;

    public LoginRequestArgs(String userEmail, String userPassword) {
        userInformation = new UserInfo(userEmail, userPassword);
    }

    static class UserInfo {
        public String userEmail;
        public String userPassword;

        public UserInfo(String userEmail, String userPassword) {
            this.userEmail = userEmail;
            this.userPassword = userPassword;
        }
    }

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

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

}
Req.java

public class Req{
    String data1;
    String data2;
    Auth authenticationMethod;
    ....
    public void setAuth(Auth authenticationMethod){
        this.authenticationMethod = authenticationMethod;
    }
}
Auth.java

public class Auth{
   ....
}
AuthToken.java

public class AuthToken extends Auth {

    Token token;

    public AuthToken(String token) {
        this.token = new Token(token);
    }

    static class Token {
        String token;

        public Token(String token) {
            this.token = token;
        }

    }
}
AuthUserInfo.java

public class AuthUserInfo extends Auth {

    UserInfo sessionId;

    public AuthUserInfo(String email, String password) {
        this.sessionId = new UserInfo(email, password);
    }

    static class UserInfo {
        String email;
        String password;

        public UserInfo(String email, String password) {
            this.email = email;
            this.password = password;
        }
    }
}
下面是如何使用这些类:

Req req = new Req(...);
Auth auth = new AuthToken(...);// OR: new AuthUserInfo(...);
req.setAuth(auth);
String json = new Gson().toJson(req);

另一种方法是在创建JSON后向其添加新属性。您可以看到一个如何做到这一点的示例

非常感谢您的帮助。这对我来说是一个很好的起点。可能它不起作用,因为我需要更多地研究我的java客户机,因为它有很多类。但是非常感谢你的回答,因为我正在寻找一个起点;)我尝试你的解决方案及其工作:非常感谢:)在你的解决方案之后,我需要调整我的JSON解析C++来获取用户信息里面的内容,但是对我来说很容易。hehe@Pik93我很高兴能帮上忙。祝你好运,再次你好。。如果我现在有这样的身体,如何在java中实现?更多的静态类?{“userInformation”:{“otherSection”:{“key1”:“value1”,“key2”:“value2”}}}@Pik93是的,您必须创建一个包含字段
key1
key2
的新类,并将该类型的变量添加到
LoginRequestArgs
类中。无需在
loginRequestStargs
中将
类定义为
静态类
,您可以为其创建单独的文件。