将JSON字符串内的key进行字符串类型转换(下滑线分割转驼峰)

最近在写项目的时候遇到一个难题关于json数据类型转换的问题

我们在网络传输的时候使用的是Json的序列化与反序列化

关于Json的转换中吗,我找到了以下的几个包:

hutool 解析包,Gson解析包,Jackson解析包

实题类定义如下:

public class Person {
 
    private String nameInfo;
 
    private String ageInfo;
 
    public String getNameInfo() {
        return nameInfo;
    }
 
    public void setNameInfo(String nameInfo) {
        this.nameInfo = nameInfo;
    }
 
    public String getAgeInfo() {
        return ageInfo;
    }
 
    public void setAgeInfo(String ageInfo) {
        this.ageInfo = ageInfo;
    }
}

以上的所有字符串字段都是驼峰映射的,但是如果我们此时需要”_“进行key的分割。

以下是几种的实现的方法

Fastjson:

// 生产环境中,config要做singleton处理,要不然会存在性能问题
Person person = new Person();
person.setNameInfo("coder");
person.setAgeInfo("28");
SerializeConfig config = new SerializeConfig();
config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
String json = JSON.toJSONString(person, config);
Assert.assertEquals("{\"age_info\":\"28\",\"name_info\":\"coder\"}", json);

Gson:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
Gson gson = gsonBuilder.create();
 
Person person = new Person();
person.setNameInfo("coder");
person.setAgeInfo("28");
 
String json = gson.toJson(person);
Assert.assertEquals("{\"age_info\":\"28\",\"name_info\":\"coder\"}", json);

Jackson:

Person person = new Person();
person.setNameInfo("coder");
person.setAgeInfo("28");

ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(com.fasterxml.jackson.databind.PropertyNamingStrategy.SNAKE_CASE);
String json = mapper.writeValueAsString(person);
Assert.assertEquals("{\"name_info\":\"coder\",\"age_info\":\"28\"}", json);

以上就是几种实现方式,备注一下之前的说的hutool这个包

StrUtil.underToline()

但是以上的会把字符串的key和value的字符串都会进行驼峰和下滑线之间的转换完成。

在Java中,将JSON字符串换为对象通常会使用一些流行的库,例如Jackson或Gson。要实现忽略大小写,并将下划线命名的键换为驼峰命名的字段,可以通过自定义反序列化来实现。 以Jackson为例,可以按照以下步骤进行: 1. 创建一个自定义的反序列化器,继承`JsonDeserializer`类,并重写`deserialize`方法。在这个方法中,可以编写逻辑来处理JSON键的换。 2. 使用`@JsonNaming`注解来指定字段命名策略,或者在反序列化器中手动调整键名。 3. 在反序列化时使用`ObjectMapper`类,并配置上面创建的反序列化器。 下面是一个简单的示例代码: ```java import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; import java.util.HashMap; import java.util.Map; class SnakeToCamelDeserializer extends StdDeserializer<Map<String, Object>> { public SnakeToCamelDeserializer() { this(null); } public SnakeToCamelDeserializer(Class<?> vc) { super(vc); } @Override public Map<String, Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { Map<String, Object> map = new HashMap<>(); JsonNode node = p.readValueAsTree(); node.fields().forEachRemaining(entry -> { String key = entry.getKey(); String camelCaseKey = key.replaceAll("([A-Z])", "_$1").toLowerCase(); map.put(camelCaseKey, entry.getValue()); }); return map; } } public class JsonToJavaObject { public static void main(String[] args) throws JsonProcessingException { String json = "{\"first_name\": \"John\", \"last_name\": \"Doe\"}"; ObjectMapper objectMapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addDeserializer(Map.class, new SnakeToCamelDeserializer()); objectMapper.registerModule(module); Map<String, Object> result = objectMapper.readValue(json, Map.class); System.out.println(result); } } ``` 在这个示例中,我们创建了一个名为`SnakeToCamelDeserializer`的自定义反序列化器,它会将JSON中的下划线命名换为驼峰命名。然后我们在`JsonToJavaObject`类的`main`方法中创建了一个`ObjectMapper`实例,并注册了我们的自定义反序列化器。最后,我们使用`readValue`方法将JSON字符串换为`Map`对象。 请注意,这个示例演示了如何将JSON字符串换为`Map`,如果您需要换为特定的Java类,还需要在类中使用相应的注解或编写相应的反序列化逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千与编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值