json How to Parse Mixed Array Objects into the list Collection of Entity Classes

  • 2021-09-20 20:41:06
  • OfStack

1. Preface

This project encountered one such requirement, parsing the following data into the object below me.

json file


[
    {
        "categories": [
            " Gourmet food, snacks and fast food "
        ],
        "coordinate": {
            "address": " Wangfujing Street 138 New Tung on Plaza 3 Layer 328",
            "area": " Dong'an Market ",
            "area_id": "jk238eewf0k",
            "city": " Beijing ",
            "city_code": "110100",
            "district": " Dongcheng District ",
            "district_code": "110101",
            "floor": "3",
            "latitude": "39.91456",
            "longitude": "116.41155",
            "province": " Beijing ",
            "province_code": "110000"
        },
        "name": " Explore fish ",
        "phone": "010-65280328",
        "poi_id": "d7s8f6s6212"
    },
    {
        "categories": [
            " Gourmet food, bread and dessert "
        ],
        "coordinate": {
            "address": " Fengtai North Road 18 Hengtai Plaza, No.1 Courtyard F6 Building ",
            "area": " Hang Tai Plaza ",
            "area_id": "ji8sgg3b32o",
            "city": " Beijing ",
            "city_code": "110100",
            "district": " Fengtai District ",
            "district_code": "110106",
            "floor": "6",
            "latitude": "39.86608",
            "longitude": "116.30516",
            "province": " Beijing ",
            "province_code": "110000"
        },
        "name": " Be hospitable ",
        "phone": "010-65280221",
        "poi_id": "3g97sg8sd67"
    }
]

Entity object:


public class LocatorData {
    //  Classification 
    private String categories;
    //  Business district 
    private String area;
    //  Business district id
    private String areaId;
    //  Province 
    private String province;
    //  Province code
    private String provinceCode;
    //  City 
    private String city;
    //  City code
    private String cityCode;
    //  District and county 
    private String district;
    //  District and county code
    private String districtCode;
    //  Floor 
    private String floor;
    //  Longitude 
    private Double latitude;
    //  Dimension 
    private Double longitude;
    //  Name of shop 
    private String name;
    //  Shop address 
    private String address;
    //  Shop telephone 
    private String phone;
    //  Shop id
    private String poiId;
}

I don't know if my friends have found that I am only an object here, and there is no 1-to-many relationship. What I want is such an effect.

But there is an coordinate object in the json file, and my entity object does not need this field. It doesn't matter, just analyze it step by step.


@RestController
public class ParseController {
	private static final Logger LOGGER = LoggerFactory.getLogger(EasyExcelController.class);
	
	@PostMapping(value = "/arrayObjectNestingParse",produces = "application/json;charset=UTF-8")
    public ReturnT<String> arrayObjectNestingParse(@RequestParam(value = "jsonFile") MultipartFile jsonFile) {
        if (jsonFile == null) {
            return new ReturnT<>(ReturnT.BAD_REQUEST, "Params can not be null");
        }
        InputStream is = null;
        BufferedReader br = null;
        StringBuffer sb = new StringBuffer();
        String str = null;
        try {
            is = jsonFile.getInputStream();
            br = new BufferedReader(new InputStreamReader(is));
            while ((str = br.readLine()) != null) {
                sb.append(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        List<LocatorData> locatorDataList = new ArrayList<>();
        JSONArray jsonArray = JSONArray.parseArray(sb.toString());
        for (int i = 0; i < jsonArray.size(); i++) {
            LocatorData locatorData = new LocatorData();
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            String categories = jsonObject.getString("categories");
            String coordinate = jsonObject.getString("coordinate");
            JSONObject coordinateObj = JSONObject.parseObject(coordinate);
            String address = coordinateObj.getString("address");
            String area = coordinateObj.getString("area");
            String areaId = coordinateObj.getString("area_id");
            String city = coordinateObj.getString("city");
            String cityCode = coordinateObj.getString("city_code");
            String district = coordinateObj.getString("district");
            String districtCode = coordinateObj.getString("district_code");
            String floor = coordinateObj.getString("floor");
            String latitude = coordinateObj.getString("latitude");
            String longitude = coordinateObj.getString("longitude");
            String province = coordinateObj.getString("province");
            String provinceCode = coordinateObj.getString("province_code");
            String name = jsonObject.getString("name");
            String phone = jsonObject.getString("phone");
            String poiId = jsonObject.getString("poi_id");
            locatorData.setCategories(categories);
            locatorData.setAddress(address);
            locatorData.setArea(area);
            locatorData.setAreaId(areaId);
            locatorData.setProvince(province);
            locatorData.setProvinceCode(provinceCode);
            locatorData.setCity(city);
            locatorData.setCityCode(cityCode);
            locatorData.setDistrict(district);
            locatorData.setDistrictCode(districtCode);
            locatorData.setFloor(floor);
            locatorData.setLatitude(Double.parseDouble(latitude));
            locatorData.setLongitude(Double.parseDouble(longitude));
            locatorData.setName(name);
            locatorData.setPhone(phone);
            locatorData.setPoiId(poiId);
            locatorDataList.add(locatorData);
        }
        LOGGER.info("locatorDataList: " + JSON.toJSONString(locatorDataList));
        return new ReturnT<>(ReturnT.SUCCESS, JSON.toJSONString(locatorDataList));
    }
}

Log printing:

2020-01-07 00:39:30. 284 [http-nio-8080-exec-3] INFO c. r. springbootdemo. EasyExcelController-locatorDataList: [{"address": "328, Floor 3, New Dong'an Plaza, No.138 Wangfujing Street", "area": "Dong'an Market", "areaId": "jk238eewf0k" EN ":" 110101 "," floor ":" 3 "," latitude ": 39.91456," longitude ": 116.41155," name ":" Exploring Fish "," phone ":" 010-65280328 "," poiId ":" d7s8f6s6212 "1EN32o", "categories": "[\" Gourmet, Bread Dessert\] "," city ":" Beijing "," cityCode ":" 110100 "," district ":" Fengtai District "," districtCode ":" 110106 "," floor ":" 6 "," latitude ": 39.86608," longitude ": 116.30516," name ":" Hospitality "," phone ":" 010-65280221 "," provinceCode ":" 110000 "}]

We use the tool to convert 1 to see more clearly 1 point:


[
    {
        "address": " Wangfujing Street 138 New Tung on Plaza 3 Layer 328",
        "area": " Dong'an Market ",
        "areaId": "jk238eewf0k",
        "categories": "[" Gourmet food, snacks and fast food "]",
        "city": " Beijing ",
        "cityCode": "110100",
        "district": " Dongcheng District ",
        "districtCode": "110101",
        "floor": "3",
        "latitude": 39.91456,
        "longitude": 116.41155,
        "name": " Explore fish ",
        "phone": "010-65280328",
        "poiId": "d7s8f6s6212",
        "province": " Beijing ",
        "provinceCode": "110000"
    },
    {
        "address": " Fengtai North Road 18 Hengtai Plaza, No.1 Courtyard F6 Building ",
        "area": " Hang Tai Plaza ",
        "areaId": "ji8sgg3b32o",
        "categories": "[" Gourmet food, bread and dessert "]",
        "city": " Beijing ",
        "cityCode": "110100",
        "district": " Fengtai District ",
        "districtCode": "110106",
        "floor": "6",
        "latitude": 39.86608,
        "longitude": 116.30516,
        "name": " Be hospitable ",
        "phone": "010-65280221",
        "poiId": "3g97sg8sd67",
        "province": " Beijing ",
        "provinceCode": "110000"
    }
]

Summary of json Array and List Collection Conversion


// Method 1, Will json Assign to individual elements after parsing 
String jstr="{'json':'jsonvalue','bool':true,'int':1,'double':'20.5'}";
JSONObject json=JSONObject.fromObject(jstr);
boolean bool=json.getBoolean("bool");
int i=json.getInt("int");
double d=json.getDouble("double");
String value=json.getString("json");
System.out.println("bool="+String.valueOf(bool)+"\tjson="+value+"\tint="+i+"\tdouble="+d);

// Method 2,json Object and bean Conversion between objects 
// If you have 1 A bean Object 
class User{
private String name;
private String psw;
// Encapsulation getter/setter Omission 
}
// Put 1 A json Object becomes user
String u="{'name':'sail331x','psw':'123456789'}";
// Use user Object reception json Elements in the 
User user=(User)JSONObject.toBean(JSONObject.fromObject(u),User.class);
// Put 1 A user Become json Object: 
JSONObject juser=JSONObject.fromObject(user);
//json String jstr
String jstr=juser.toString();

// Method 3,json Object direct transfer list Collection, list Aggregation turn json Object 
// Declaration 1 A Person  Entity class: 
import java.util.Date;
public class Person {
    String id;
    int age;
    String name;
    Date birthday;
    //get,set Method omission 
}
// Test json Data conversion 
import java.util.Iterator;
import java.util.List;
import org.junit.Test;
import net.sf.json.JSONArray;
import net.sf.json.JsonConfig;
public class JsonToList {
    public static void main(String[] args) {
          String json="[{'name':'zhuangsan','age':18},{'name':'lisi','age':20}]";
          JSONArray jsonarray = JSONArray.fromObject(json);
          System.out.println(jsonarray);
          List list = (List)JSONArray.toCollection(jsonarray, Person.class);
          Iterator it = list.iterator();
          while(it.hasNext()){
                Person p = (Person)it.next();
                System.out.println(p.getAge());
          }
    }
    @Test
    public void jsonToList1(){
          String json="[{'name':'zhuangsan','age':18},{'name':'lisi','age':20}]";
          JSONArray jsonarray = JSONArray.fromObject(json);
          System.out.println(jsonarray);
          List list = (List)JSONArray.toList(jsonarray, Person.class);
          Iterator it = list.iterator();
          while(it.hasNext()){
                Person p = (Person)it.next();
                System.out.println(p.getAge());
          }
    }
    @Test
    public void jsonToList2(){
          String json="[{'name':'zhuangsan','age':20},{'name':'lisi','age':18}]";
          JSONArray jsonarray = JSONArray.fromObject(json);
          System.out.println(jsonarray);
          System.out.println("------------");
          List list = (List)JSONArray.toList(jsonarray, new Person(), new JsonConfig());
          Iterator it = list.iterator();
          while(it.hasNext()){
                Person p = (Person)it.next();
                System.out.println(p.getAge());
          }
    }
}
// Will list Object conversion JSON String array: 
import java.util.LinkedList;
import java.util.List;
import net.sf.json.JSONArray;
public class ListToJson {
    public static void main(String[] args) {
          List list = new LinkedList();
          for(int i=0;i<3;i++){
                Person p = new Person();
                p.setAge(i);
                p.setName("name"+i);
                list.add(p);
          }
    JSONArray jsonarray = JSONArray.fromObject(list);
    System.out.println(jsonarray);
    }
}

Related articles: