Java将json中key值下划线转为驼峰格式

Posted 赵广陆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java将json中key值下划线转为驼峰格式相关的知识,希望对你有一定的参考价值。

目录


1 需求说明

在开发过程中,有时会遇到json不是严格按照驼峰命名,需要将其中带有下划线的字段进行格式化转换为驼峰命名。

如果是对JSON格式里的返回字段清楚的情况下,可以进行逐层解析转换。

但是,效率比较低,而且JSON里可能会循环嵌套多层JSONObject或JSONArray。

如何使用通用的方式进行转换?

2 Java工具类转换实现

比较笨的方法,使用工具类进行转化对应的格式

2.1 代码


import java.util.Set;


public class JsonUtil 

    public static void convert(Object obj) 
        if (obj instanceof JSONArray) 
            JSONArray jsonArray = (JSONArray) obj;
            for (Object json : jsonArray) 
                convert(json);
            
         else if (obj instanceof JSONObject) 
            JSONObject json = (JSONObject) obj;
            Set<String> keySet = json.keySet();
            String[] keyArray = keySet.toArray(new String[keySet.size()]);
            for (String key : keyArray) 
                Object value = json.get(key);
                String[] keyStrs = key.split("_");
                if (keyStrs.length > 1) 
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < keyStrs.length; i++) 
                        String keyStr = keyStrs[i];
                        if (!keyStr.isEmpty()) 
                            if (i == 0) 
                                sb.append(keyStr);
                             else 
                                int c = keyStr.charAt(0);
                                if (c >= 97 && c <= 122) 
                                    int v = c - 32;
                                    sb.append((char) v);
                                    if (keyStr.length() > 1) 
                                        sb.append(keyStr.substring(1));
                                    
                                 else 
                                    sb.append(keyStr);
                                
                            
                        
                    
                    json.remove(key);
                    json.put(sb.toString(), value);
                
                convert(value);
            
        
    

    /**
     * 将json字符串中的key名称中包含下划线的字段,转成驼峰命名格式
     *
     * @param str String格式的JSON串
     * @return 转换后的对象(可能是JSONObject或JSONArray)
     */
    public static Object convertUnderlineToCamelCase(String str) 
        Object obj = JSON.parse(str);
        convert(obj);
        return obj;
    

    public static void main(String[] args) 
        String json = "\\n" +
                "  \\"test\\": [\\n" +
                "    \\n" +
                "      \\"self_auth\\": \\n" +
                "        \\"a_id\\": \\"123\\",\\n" +
                "        \\"b_num\\": 7,\\n" +
                "        \\"user_name\\": \\"oldlu\\"\\n" +
                "      \\n" +
                "    \\n" +
                "  ]\\n" +
                "";
        System.out.println(convertUnderlineToCamelCase(json));
    

1.2 运行结果


  "test": [
    
      "self_auth": 
        "aId": "123",
        "bNum": 7,
        "userName": "oldlu"
      
    
  ]

3 转换为对应的java实体

接口定义是蛇形命名,实体类定义为驼峰

主要依靠这句:@JSONType(naming= PropertyNamingStrategy.SnakeCase)

import com.alibaba.fastjson.PropertyNamingStrategy;
import com.alibaba.fastjson.annotation.JSONType;


@JSONType(naming= PropertyNamingStrategy.SnakeCase)
public class TestJSON 
    private String aBcD;

    public String getaBcD() 
        return aBcD;
    

    public void setaBcD(String aBcD) 
        this.aBcD = aBcD;
    


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class Test 
    public static void main(String[] args) 
        TestJSON testJSON = new TestJSON();
        testJSON.setaBcD("aaa");
        System.out.println(JSONObject.toJSON(testJSON));

        String json = "\\"a_bc_d\\":\\"aaa\\"";
        TestJSON testJSON1 = JSON.parseObject(json, TestJSON.class);
        System.out.println(JSONObject.toJSON(testJSON1));
    

结果为:

注:看到结果还是下划线不影响最终转换,如果需要返回不是驼峰的可能还需要没有注解的实体进行赋值转换,或者用上方工具类看自己取舍。

以上是关于Java将json中key值下划线转为驼峰格式的主要内容,如果未能解决你的问题,请参考以下文章

java复杂json字符串转为java对象

java实现驼峰和下划线相互转换

Java字符串转为驼峰格式构建工具类

Java-驼峰命名与下划线命名互转

将circe中json对象的所有键从“下划线”转换为“驼峰式”

javaBean转换为json怎么实现指定属性名风格,如驼峰和下划线两种