如何使用Gson将JSON中的"key":1b解析为byte类型?
问题解答
Gson能否识别1b为byte字面量?
不能。因为1b不符合标准JSON规范——JSON的数字类型仅支持十进制整数、浮点数、科学计数法格式,不允许携带b/s/l这类Java风格的类型后缀。Gson作为遵循JSON规范的解析库,会将这种不符合规范的内容解析为字符串,这是预期行为。
解析带Java风格类型后缀的伪JSON值的推荐方法
如果无法修改输入的伪JSON格式,可通过以下方式处理:
1. 自定义类型解析器(推荐用于实体类映射场景)
通过Gson的JsonDeserializer或TypeAdapter实现自定义解析逻辑,自动识别后缀并转换为对应Java类型:
示例:处理byte类型后缀b的解析器
import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import java.lang.reflect.Type; public class ByteSuffixDeserializer implements JsonDeserializer<Byte> { @Override public Byte deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { String rawValue = json.getAsString().trim(); // 识别并移除b后缀(忽略大小写) if (rawValue.toLowerCase().endsWith("b")) { String numStr = rawValue.substring(0, rawValue.length() - 1).trim(); return Byte.parseByte(numStr); } // 兼容无后缀的数字字符串 return Byte.parseByte(rawValue); } }
注册解析器并使用
import com.google.gson.Gson; import com.google.gson.GsonBuilder; // 定义实体类 class DataModel { private Byte key; // getter和setter public Byte getKey() { return key; } public void setKey(Byte key) { this.key = key; } } public class Main { public static void main(String[] args) { String json = "{\"key\": 1b}"; Gson gson = new GsonBuilder() .registerTypeAdapter(Byte.class, new ByteSuffixDeserializer()) .registerTypeAdapter(byte.class, new ByteSuffixDeserializer()) .create(); DataModel model = gson.fromJson(json, DataModel.class); System.out.println(model.getKey()); // 输出:1(类型为byte) } }
如果需要支持s(short)、l(long)等其他后缀,只需扩展类似的解析器,注册对应类型即可。
2. 手动处理字符串值(适用于直接操作JsonElement的场景)
如果不需要映射到实体类,直接解析后手动处理字符串内容:
import com.google.gson.JsonElement; import com.google.gson.JsonParser; public class Main { public static void main(String[] args) { String json = "{\"key\": 1b}"; JsonElement element = JsonParser.parseString(json); String keyStr = element.getAsJsonObject().get("key").getAsString(); Byte keyValue; if (keyStr.toLowerCase().endsWith("b")) { // 移除后缀并转换为byte keyValue = Byte.parseByte(keyStr.substring(0, keyStr.length() - 1).trim()); } else { // 处理无后缀的情况 keyValue = Byte.parseByte(keyStr); } System.out.println(keyValue); // 输出:1(类型为byte) } }
3. 优先修改输入为标准JSON(最稳妥方案)
如果有权限修改输入的JSON内容,建议将1b改为标准数字1,后续在Java代码中根据需求将数字转换为byte类型,完全符合JSON规范,避免自定义解析的额外成本。
内容的提问来源于stack exchange,提问作者SB_STOPDL
相关产品推荐
相关产品推荐

