本文主要探讨本人在写一项目需求时,对于大量使用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);
总结
- 获取json数据根据要获取数据选择使用,ObjectNode或者ArrayNode,对于ObjectNode的创建可以使用objectMapper.createObjectNode()。
- 如需要获取的属性在较深层可以使用迭代器循环便利,去找到目标值。
- 如果需要操作的JSON为{"data1":1,"data2":"2"},不要直接.get(),需要向下进一层。objectMapper.readTree(data).get("data1").iterator().next().asText();