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值处理,代码更易维护:
- 定义实体类
// 对应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; } }
- 解析并转换原始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
相关产品推荐
相关产品推荐

