gpt4 book ai didi

java - 使用json在c++和java之间交换对象

转载 作者:行者123 更新时间:2023-12-02 08:41:54 25 4
gpt4 key购买 nike

我正在尝试使用 websockets 和 json 将存储在对象上的数据从 c++/qt 项目交换到 java/spring。通过 websockets 的通信工作正常,但在 java/spring 中,数据以 null 形式到达。

在 C++ 类中,我有类似的东西:

QString Usuario::toString() {
QString json = "{'email': "+email+"}";
QJsonDocument document = QJsonDocument::fromJson(json.toUtf8());
QByteArray prettyPrintedJson = document.toJson(QJsonDocument::Indented);
return prettyPrintedJson;
}

对于这样的类:

usuario.h

class Usuario
{
private:
QString email;
public:
Usuario();
Usuario(QString email);

QString getEmail();
void setEmail(QString email);

QString toString();
};

registro.h

class Registro
{
private:
QString token;
Usuario usuario;
Produto produto;
Maquina maquina;
public:
Registro();
Registro(QString token, Usuario usuario, Produto produto, Maquina maquina);
Registro(Usuario usuario, Produto produto, Maquina maquina);

QString getToken();
void setToken(QString token);

Usuario getUsuario();
void setUsuario(Usuario usuario);

Produto getProduto();
void setProduto(Produto produto);

Maquina getMaquina();
void setMaquina(Maquina maquina);

QString toString();
};

在java项目中,我有这样的东西:

@Component
public class CheckRegistro extends TextWebSocketHandler {
...
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws InterruptedException, IOException {
Registro value = new Gson().fromJson(message.getPayload(), Registro.class);
System.out.println("registro -> " + value);

String email_usuario = value.getUsuario().getEmail();
Usuario usuario = usuarioServ.findBy("email", email_usuario);

String nome_produto = value.getProduto().getNome();
Produto produto = produtoServ.findBy("nome", nome_produto);

Cliente cliente = clienteServ.findBy("usuario", usuario);
if(cliente.produtosComprados().contains(produto))
value = registroServ.findBy("produto", produto);

String result = new Gson().toJson(value);
session.sendMessage(new TextMessage(result));
}
...
}

以及类似的类:

usuario.java

@Entity
public class Usuario extends Model implements UserDetails {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

@Column
private String username;

@Column
private String password;

@Column
private String firstName;

@Column
private String lastName;

@Column
private String email;
...
}

registro.java

@Entity
public class Registro extends Model{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

@Column
private String token;

@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Usuario usuario;

@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Produto produto;

@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Maquina maquina;
...
}

(郑重声明,某些类(如 usuario)在 java 中的字段数量多于 c++;其他类(如 registro)在 c++ 端或在 c++ 端具有相同的字段java 端)。

有人可以提示我这里出了什么问题吗?我知道有一些库可以自动将 c++ 对象序列化为 json,但我不知道是否可以在不向我的项目添加第三方组件的情况下做到这一点,只需找到发送到 java 套接字的字符串的正确格式即可。

更新

我将 C++ 端的 toString 方法更改为类似的内容:

QString Registro::toString() {
QJsonObject json{
{ "token", token },
{ "usuario", usuario.toString() },
{ "produto", produto.toString() },
{ "maquina", maquina.toString() }
};
QJsonDocument jsonDoc;
jsonDoc.setObject(json);
QByteArray prettyPrintedJson = jsonDoc.toJson(QJsonDocument::Indented);
return prettyPrintedJson;
}

现在,在java端,json字符串打印如下:

"registro": "{\n    \"maquina\": \"{\\n    \\\"cpuArch\\\": \\\"x86_64\\\",\\n    \\\"hostName\\\": \\\"DESKTOP-7GAPC4K\\\",\\n    \\\"kernelType\\\": \\\"windows\\\",\\n    \\\"kernelVersion\\\": \\\"10\\\",\\n    \\\"productName\\\": \\\"Windows 10 Version 1909\\\",\\n    \\\"ram\\\": \\\"RAM: 16030 MB\\\",\\n    \\\"uniqueId\\\": \\\"c69d8cc7-8e66-4ea3-964a-792b2c2a6f80\\\"\\n}\\n\",\n    \"produto\": \"{\\n    \\\"nome\\\": \\\"prod1\\\"\\n}\\n\",\n    \"token\": \"\",\n    \"usuario\": \"{\\n    \\\"email\\\": \\\"klebermo@gmail.com\\\"\\n}\\n\"\n}\n"
}

更新2

我将 C++ 端的方法 toString 更改为类似的内容:

QString Registro::toString() {
return "{ \"token\": \""+token+"\", \"usuario\": "+usuario.toString()+", \"produto\": "+produto.toString()+", \"maquina\": "+maquina.toString()+" }";
}

现在在java端我得到了一个有效的json,但是在这里:

Registro value = new Gson().fromJson(message.getPayload(), Registro.class);

String email_usuario = value.getUsuario().getEmail();
Usuario usuario = usuarioServ.findBy("email", email_usuario);

String nome_produto = value.getProduto().getNome();
Produto produto = produtoServ.findBy("nome", nome_produto);

我收到 value.getUsuario().getEmail()NullPointerException。我真的需要从 c++ 端发送一个包含 java 类中所有字段的类吗?有什么方法可以让我只发送包含此查询所需字段的类吗?或者这不是问题?

最佳答案

Usuario::toString 中的

json 不是有效的 JSON。 QJsonDocument::fromJson 解析失败时返回 null

假设 email 未引用,您需要:

QString json = "{\"email\": \""+email+"\"}";

或者,更安全、更简单的方法是使用 JSON API:

QJsonObject json{
{ "email", email }
};
QJsonDocument document = QJsonDocument::fromJson(json);
QByteArray prettyPrintedJson = document.toJson(QJsonDocument::Indented);

关于java - 使用json在c++和java之间交换对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61330724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com