当前位置:网站首页>Fastjson parses JSON strings (deserialized to list, map)

Fastjson parses JSON strings (deserialized to list, map)

2022-07-06 21:16:00 I hope to wake up naturally every day

When dealing with database in daily development , Often with Json Format string stored in the database , When in Java Get the corresponding Json Format String After the string , How to convert to the data format we want ( Like converting to Java Custom classes in ), You need to make the right Json Data analysis , The interface I recently wrote meets such a demand , I use Ali's Fastjson api Realization json Turn into Java POJO, Now let's make a simple summary , Make a note of .

To configure maven rely on

Introduce three dependencies respectively , Namely fastjson、lombok、commons tool kit .

<dependencies>
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.78</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.22</version>
        <scope>compile</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>
</dependencies>

I have written the version number , Please use a specific version if necessary , It is recommended to use the latest version of .

Data preparation

Let's simply construct a little data , Requirements for data analysis : Whole json Turn into a POJO, among code、name The type is String,schedule The type is List<String> Represents the plan list ,completion The type is Map<String,String> It means that the completion is mapped one by one .

Build Monday to Sunday plan & completion Of json data :

[
    {
    
        "code":"monday",
        "name":" Monday ",
        "schedule":"get_up_9am,exercise_one_hour,study_one_hour,goto_bed_before_12pm",
        "completion":"get_up_9am=y,exercise_one_hour=n,study_one_hour=y,goto_bed_before_12pm=n"
    },{
    
        "code":"tuesday",
        "name":" Tuesday ",
        "schedule":"exercise_one_hour,study_one_hour,goto_bed_before_12pm",
        "completion":"exercise_one_hour=y,study_one_hour=y,goto_bed_before_12pm=y"
    },{
    
        "code":"wednesday",
        "name":" Wednesday ",
        "schedule":"get_up_9am,exercise_one_hour,goto_bed_before_12pm",
        "completion":"get_up_9am=n,exercise_one_hour=n,goto_bed_before_12pm=n"
    },{
    
        "code":"thursday",
        "name":" Thursday ",
        "schedule":"",
        "completion":""
    },{
    
        "code":"friday",
        "name":" Friday ",
        "schedule":"study_one_hour,goto_bed_before_12pm",
        "completion":"study_one_hour=n,goto_bed_before_12pm=n"
    },{
    
        "code":"saturday",
        "name":" Saturday ",
        "schedule":"goto_bed_before_12pm",
        "completion":"goto_bed_before_12pm=n"
    },{
    
        "code":"sunday",
        "name":" Sunday ",
        "schedule":"",
        "completion":""
    }
]

JSON Format string to Java object

The following is the direct post code

DO&DTO

DO It's all for String Data of type ,DTO It's one of them schedule by List,completion by Map Format

WeekScheduleDO

package com.xxx;
import lombok.Data;

@Data
public class WeekScheduleDO {
    
    private String code;
    private String name;
    private String schedule;
    private String completion;
}

WeekScheduleDTO

package com.fast;
import lombok.Data;
import java.util.List;
import java.util.Map;

@Data
public class WeekScheduleDTO {
    
    private String code;
    private String name;
    private List<String> schedule;
    private Map<String,String> completion;
}

SelfJSONUtils

Customize and encapsulate the methods needed for parsing

package com.xxx;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.apache.commons.lang3.StringUtils;

import java.util.*;
import java.util.stream.Collectors;

public class SelfJSONUtils {
    
    public static List<WeekScheduleDTO> toWeekScheduleDOs(String str){
    
        // String->List<WeekScheduleDO>
        List<WeekScheduleDO> weekScheduleDOs = JSON.parseObject(str, new TypeReference<List<WeekScheduleDO>>() {
    });

        List<WeekScheduleDTO> result = new ArrayList<>();
        for (WeekScheduleDO item:weekScheduleDOs) {
    
            result.add(toWeekScheduleDTO(item));
        }

        return result;
    }

    private static WeekScheduleDTO toWeekScheduleDTO(WeekScheduleDO item){
    
        WeekScheduleDTO weekScheduleDTO = new WeekScheduleDTO();
        weekScheduleDTO.setCode(item.getCode());
        weekScheduleDTO.setName(item.getName());

        // "schedule":"get_up_9am,..."  convert to lsit
        String[] schedule = item.getSchedule().split(",");
        weekScheduleDTO.setSchedule(Arrays.stream(schedule).filter(e -> StringUtils.isNoneBlank(e)).collect(Collectors.toList()));

        // "completion":"get_up_9am=y,..."  convert to map
        weekScheduleDTO.setCompletion(toMap(item.getCompletion().split(",")));

        return weekScheduleDTO;
    }

    private static Map<String,String> toMap(String[] args){
    
        Map<String,String> map = new HashMap<>();
        for(String arg : args){
    
            if(!arg.isEmpty()) {
    
                String[] split1 = arg.split("=");
                map.put(split1[0], split1[1]);
            }
        }
        return map;
    }
}

test & call

package com.xxx;
import java.util.List;

public class Demo {
    
    public static void main(String[] args) {
    
        String json = "[{\"code\":\"monday\",\"name\":\" Monday \",\"schedule\":\"get_up_9am,exercise_one_hour,study_one_hour,goto_bed_before_12pm\",\"completion\":\"get_up_9am=y,exercise_one_hour=n,study_one_hour=y,goto_bed_before_12pm=n\"},{\"code\":\"tuesday\",\"name\":\" Tuesday \",\"schedule\":\"exercise_one_hour,study_one_hour,goto_bed_before_12pm\",\"completion\":\"exercise_one_hour=y,study_one_hour=y,goto_bed_before_12pm=y\"},{\"code\":\"wednesday\",\"name\":\" Wednesday \",\"schedule\":\"get_up_9am,exercise_one_hour,goto_bed_before_12pm\",\"completion\":\"get_up_9am=n,exercise_one_hour=n,goto_bed_before_12pm=n\"},{\"code\":\"thursday\",\"name\":\" Thursday \",\"schedule\":\"\",\"completion\":\"\"},{\"code\":\"friday\",\"name\":\" Friday \",\"schedule\":\"study_one_hour,goto_bed_before_12pm\",\"completion\":\"study_one_hour=n,goto_bed_before_12pm=n\"},{\"code\":\"saturday\",\"name\":\" Saturday \",\"schedule\":\"goto_bed_before_12pm\",\"completion\":\"goto_bed_before_12pm=n\"},{\"code\":\"sunday\",\"name\":\" Sunday \",\"schedule\":\"\",\"completion\":\"\"}]";
        
        List<WeekScheduleDTO> weekScheduleDTOS = SelfJSONUtils.toWeekScheduleDOs(json);

        System.out.println(weekScheduleDTOS);
    }
}

Now you can run directly or debug View the resolution

 Insert picture description here

This requirement should be considered as a conventional complex situation , If there are more complicated situations , The transformation form can also be adjusted according to the gourd and the gourd ~

Points of attention

If you're careful , You will find that there is a redundant operation in my code , It is located in SelfJSONUtils#toBatchItemDTO Converted to List Over there Stream Flow place

weekScheduleDTO.setSchedule(Arrays.stream(schedule).filter(e -> StringUtils.isNoneBlank(e)).collect(Collectors.toList()));

fastjson When you switch , The default is null We're going to get rid of the data ( Optional ), According to this characteristic , I just use the following code ( No, filter):

weekScheduleDTO.setSchedule(Arrays.stream(schedule).collect(Collectors.toList()));

Not really filter(e -> StringUtils.isNoneBlank(e)) You can't . In the code map When you switch , It's really the elimination of empty data , turn map After coming out, I did size=0( Here's the picture ), In turn List When , If there is no empty data , The data will be in "" The form is stored in List in ( I've been in this hole for a long time !!)

 Insert picture description here

Except for the above StringUtils#isNoneBlank Except empty , You can also use e.hashCode()!=0 To solve , Of course, this is not StringUtils Strategies to use when available

weekScheduleDTO.setSchedule(Arrays.stream(schedule).filter(e -> e.hashCode()!=0).collect(Collectors.toList()));

Simply analyze the reasons for this situation :
fastjosn analysis josn by POJO When , First we'll create a pojo An empty object , Then, through the entity class set Method to assign a value to a parameter , because fastjson When parsing, it defaults to null The data of is eliminated , therefore fastjson If the field is not reserved, it will not be set operation , and pojo Class is not assigned by anyone from beginning to end , As String The default type is "", And in the conversion to List When , It will be directly stored in a ""(List<String> Can store multiple "").

This problem may not be big , But when business needs cannot be implemented according to our ideas because of this small point , It's hard to find this tiny problem .

in addition ,JSON The data is deserialized to Java Object time , Must have a default parameterless constructor , Otherwise, the following exceptions will be reported

com.alibaba.fastjson.JSONException: default constructor not found.

Fastjson API

Fastjson Be recognized as Java And json The fastest interactive Library ! Take a brief look at Fastjson Of api Design , For serialization and serialization json There are many optional operations for data , such as @JSONField 、BeanToArray、ContextValueFilter To configure JSON transformation 、NameFilter and SerializeConfig wait . For specific use, please refer to the official API that will do .


Reference resources :

JSON A word is clear ,Java、JS And JSON Interturn

Fastjson A concise tutorial | Novice tutorial (runoob.com)

原网站

版权声明
本文为[I hope to wake up naturally every day]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202131125518213.html

随机推荐