开发者社区> 问答> 正文

json字符串反序列化为jsonobject或者map时,snake_case可以转为驼峰吗?

通过JSON.parseObject() 将字符串转为jsonobject的时候,可以同时将json中的key由下划线蛇形转为驼峰命名方式吗? 不通过自定义对象进行反序列化。

原提问者GitHub用户wolf92

展开
收起
大圣东游 2023-04-21 12:08:01 691 0
2 条回答
写回答
取消 提交回答
  • 值得去的地方都没有捷径

    可以通过使用Gson库的JsonDeserializer接口来实现将下划线蛇形命名的key转换为驼峰命名方式,具体步骤如下:

    引入Gson库的依赖: com.google.code.gson gson 2.8.7 创建一个实现JsonDeserializer接口的类,重写deserialize方法: import com.google.gson.*;

    import java.lang.reflect.Type;

    public class SnakeCaseToCamelCaseDeserializer implements JsonDeserializer {

    @Override
    public JsonObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        JsonObject result = new JsonObject();
    
        for (String key : jsonObject.keySet()) {
            String convertedKey = convertSnakeCaseToCamelCase(key);
            JsonElement value = jsonObject.get(key);
            result.add(convertedKey, value);
        }
    
        return result;
    }
    
    private String convertSnakeCaseToCamelCase(String str) {
        StringBuilder sb = new StringBuilder();
        boolean nextUpperCase = false;
    
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
    
            if (c == '_') {
                nextUpperCase = true;
            } else {
                if (nextUpperCase) {
                    sb.append(Character.toUpperCase(c));
                    nextUpperCase = false;
                } else {
                    sb.append(Character.toLowerCase(c));
                }
            }
        }
    
        return sb.toString();
    }
    

    } 调用Gson的fromJson方法,并传入自定义deserializer: import com.google.gson.Gson; import com.google.gson.GsonBuilder;

    public class Example { private static final String JSON_STRING = "{"user_name":"John","user_age":30,"user_email":"john@example.com"}";

    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(JsonObject.class, new SnakeCaseToCamelCaseDeserializer())
                .create();
    
        JsonObject jsonObject = gson.fromJson(JSON_STRING, JsonObject.class);
        System.out.println(jsonObject);
    }
    

    } 输出结果:

    {"userName":"John","userAge":30,"userEmail":"john@example.com"} 可以看到,key已经被转换成了驼峰命名方式。

    2023-04-21 21:08:40
    赞同 展开评论 打赏
  • 现在就支持的,比如:

    String json = "..."; Bean bean = JSON.parseObject(json, Bean.class, JSONReader.Feature.SupportSmartMatch);

    关于Feature的介绍 https://github.com/alibaba/fastjson2/wiki/Features_cn

    你也可以关注 Annotation注入的方式定制反序列化 https://github.com/alibaba/fastjson2/wiki/mixin_cn

    原回答者GitHub用户wenshao

    2023-04-21 15:01:03
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载