代码实战中对用java解析json数据总结

本文主要探讨本人在写一项目需求时,对于大量使用json提交数据,对使用java解析封装json的部分方法和总结。

okhttp的配置

@Configuration
public class OkHttpClientConfig {
    TrustManager[] trustAllCerts = new TrustManager[]{
            new X509TrustManager() {
                @Override
                public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                }

                @Override
                public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                }

                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return new java.security.cert.X509Certificate[]{};
                }
            }
    };

    @Bean
    public OkHttpClient okHttpClient() throws NoSuchAlgorithmException, KeyManagementException {
        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
        return new OkHttpClient.Builder()
                .connectTimeout(60, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .followRedirects(false)
                .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0])
                .hostnameVerifier((hostname, session) -> true)
                .build();
    }
}

 依赖

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.18.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.18.1</version>
        </dependency>

启动函数代码

该需求是将一个就数据库的数据通过api提交到新的数据库,中间会涉及部分数据库操作 。

对于从数据库获取的数据用HashMap<String,Object>,尽量不要用HashMap<String,String>去存储,又可能会有interge转换string的报错

    public void start() throws IOException, InterruptedException {
        List<HashMap<String,Object>> list = sqlMapper.selectAll();
        for (HashMap<String,Object> s : list) {
            System.out.printf("成功:%d 失败:%d",success,fail);
            String patientId = (String) s.get("patient_id");
            HashMap<String,String> patientInformation = sqlMapper.selectPatientInformation(patientId);
            String name = patientInformation.get("name");
            System.out.println(patientInformation.get("claims"));
            JsonNode claming = objectMapper.readTree(patientInformation.get("claims"));
            String username= patientInformation.get("phone_number");
            String firstName = name.substring(0,1);
            String lastName = name.substring(1);
            try {
                String newPatientId = helpRegist(lastName,firstName,claming.get("gender").asText(),claming.get("birthdate").asText(),username);
                HashMap<String,String> checkInformation = sqlMapper.selectCheckInformation((String) s.get("id"));
                if(((Integer)s.get("has_qs")) == 1){
                    try {
                        comitQS(newPatientId,checkInformation.get("qs"));
                    }
                    catch(Exception ignore){

                    }
                }

                if(((Integer)s.get("has_fp")) == 1){
                    try {
                        comitFP(newPatientId,checkInformation.get("fp"));
                    }
                    catch(Exception ignore){

                    }
                }
                if (((Integer)s.get("has_lk")) == 1){
                    try {
                        comitFace(newPatientId,checkInformation.get("lk"));
                    }
                    catch(Exception ignore){

                    }
                    try {
                        comitTongue(newPatientId,checkInformation.get("lk"));
                    }
                    catch(Exception ignore){

                    }
                }
                sqlMapper.deleteValueImport((String)s.get("id"));
                ++success;
                System.out.println("提交成功,ID:" + username + "  姓名:" + name);
            }
            catch (NotFoundException ignored){
                ++fail;
            }
        }
    }

对于JSON中单个字段的获取

{
	"id": "0",
	"name": "a",
	"email": "",
	"gender": "男",
	"address": "",
	"picture": "data:imRc"
	"identity": "3719",
	"nickname": "dff",
	"birthdate": "2222/3/1",
	"phoneNumber": "100000"
}

对于gender的获取

JsonNode claming = objectMapper.readTree(patientInformation.get("claims"));
 String newPatientId = helpRegist(lastName,firstName,claming.get("gender").asText(),claming.get("birthdate").asText(),username);

对于JSON中多个字段的获取

{
	"symptoms": [{
		"id": 1,
		"name": "hello"
	}, {
		"id": 2,
		"name": "hello2"
	}],
	"datetime": "1999-9-9"
}

获取每一个字段下面的name

        List<String> data = new ArrayList<>();
        for (JsonNode jsonNode : objectMapper.readTree(qs).get("symptoms")) {
            data.add(jsonNode.get("name").asText());
        }
        String stringData =  String.join(",",data);

对于将多个字段封装为一个JSON的获取

{
	"symptoms": [{
		"id": 1,
		"name": "ds"
	}],
	"datas": [{
		"name": "\u5bf81",
         "values":[1,2,3]
    }, {
		"name": "\u5c3a15",
        "values":[1,2,3]
    }],
	"datetime": "1991-9-9"
}

获取values封装成json

这里的Name是替换原有的name,这里的origin里面为空。

 String[] name = new String[]{"1","2"};
        List<ArrayNode> data = new ArrayList<>();
        for (JsonNode jsonNode : objectMapper.readTree(fp).get("datas")) {
            data.add((ArrayNode)jsonNode.get("values"));
        }
        ObjectNode root = objectMapper.createObjectNode();
        root.put("origin",objectMapper.createObjectNode());
        ObjectNode smooth = objectMapper.createObjectNode();
        for(int i=0;i<name.length;i++){
            smooth.put(name[i],data.get(i));
        }
        root.put("smooth",smooth);

对于获取图片转换为binary提交

{
	"symptoms": [],
    "face": ["data:image/jpeg;base64,/9j/4AAQS],
    "datetime": "1099-9-9"
}

获取faceImage转换为相应格式进行上传 

 String imageData = objectMapper.readTree(face).get("face").iterator().next().asText();
        // 去掉 "data:image/jpeg;base64," 前缀
        String base64Data = imageData.replace("data:image/jpeg;base64,", "");
        // 将 base64 编码的字符串转换为字节数组
        byte[] imageBytes = Base64.getDecoder().decode(base64Data);

总结

  1. 获取json数据根据要获取数据选择使用,ObjectNode或者ArrayNode,对于ObjectNode的创建可以使用objectMapper.createObjectNode()。
  2. 如需要获取的属性在较深层可以使用迭代器循环便利,去找到目标值。
  3. 如果需要操作的JSON为{"data1":1,"data2":"2"},不要直接.get(),需要向下进一层。objectMapper.readTree(data).get("data1").iterator().next().asText();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值