You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android(Kotlin)中如何转换指定JSON格式并用于Socket emit?

Android中转换JSON格式并用于Socket.emit的解决方案

核心需求拆解

你需要将带字符串引号的JSON:

{"receiver_id":"193","signal_data":{},"sender_id":"192","call_to":"null"}

转换为符合Socket.emit要求的格式(键无引号、数值为整数、call_to转为原生null),本质是把JSON字符串中的字符串类型数值转为整数,把字符串"null"转为Java的null,再构造可被Socket.io客户端序列化的对象。

方法一:使用实体类+Gson处理(推荐)

通过定义对应结构的实体类,结合Gson完成类型转换与null值处理,代码更易维护:

  1. 定义实体类
// 对应signal_data的空对象
public class SignalData {}

// 对应完整的Socket payload结构
public class SocketPayload {
    private int receiver_id;
    private SignalData signal_data;
    private int sender_id;
    private Object call_to; // 用Object兼容null和其他可能的类型

    // 生成getter/setter方法
    public int getReceiver_id() { return receiver_id; }
    public void setReceiver_id(int receiver_id) { this.receiver_id = receiver_id; }
    public SignalData getSignal_data() { return signal_data; }
    public void setSignal_data(SignalData signal_data) { this.signal_data = signal_data; }
    public int getSender_id() { return sender_id; }
    public void setSender_id(int sender_id) { this.sender_id = sender_id; }
    public Object getCall_to() { return call_to; }
    public void setCall_to(Object call_to) { this.call_to = call_to; }
}
  1. 解析并转换原始JSON
String originalJson = "{\"receiver_id\":\"193\",\"signal_data\":{},\"sender_id\":\"192\",\"call_to\":\"null\"}";

// 先解析为JsonObject
JsonObject jsonObj = new Gson().fromJson(originalJson, JsonObject.class);

// 手动处理字段类型与null值
SocketPayload payload = new SocketPayload();
payload.setReceiver_id(jsonObj.get("receiver_id").getAsInt());
payload.setSender_id(jsonObj.get("sender_id").getAsInt());
payload.setSignal_data(new SignalData()); // 空对象直接实例化

// 把字符串"null"转为Java的null
String callToStr = jsonObj.get("call_to").getAsString();
payload.setCall_to("null".equals(callToStr) ? null : callToStr);

// 直接传入Socket.emit,客户端会自动序列化为正确格式
socket.emit("your_event_name", payload);

方法二:手动构造HashMap(快速实现)

如果不想定义实体类,可直接构造Map来处理类型转换:

String originalJson = "{\"receiver_id\":\"193\",\"signal_data\":{},\"sender_id\":\"192\",\"call_to\":\"null\"}";
JsonObject jsonObj = new Gson().fromJson(originalJson, JsonObject.class);

Map<String, Object> payloadMap = new HashMap<>();
payloadMap.put("receiver_id", jsonObj.get("receiver_id").getAsInt());
payloadMap.put("sender_id", jsonObj.get("sender_id").getAsInt());
payloadMap.put("signal_data", new HashMap<>()); // 空对象用空Map替代

String callToStr = jsonObj.get("call_to").getAsString();
payloadMap.put("call_to", "null".equals(callToStr) ? null : callToStr);

// 发送到Socket
socket.emit("your_event_name", payloadMap);

为什么JsonParser直接用没效果?

你之前尝试的JsonParser只是将JSON字符串解析为JsonObject,但没有修改字段的类型:receiver_id仍为字符串类型,call_to还是"null"字符串,Socket.io客户端会按原类型序列化,自然达不到预期格式。必须手动转换数值类型并处理null值。

内容的提问来源于stack exchange,提问作者Sumita Naiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:05:19