fastjson解析多层数据_FastJson 解析复杂多层数据

本文介绍了一个工作中遇到的JSON解析问题,涉及如何处理包含多层数据的JSON字符串,并提供了一个使用FastJson递归解析的方法。通过递归遍历JSON对象,将所有有值的键值对提取到一层。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作中遇到了一个关于解析Json串的问题 先上串

{

"timestamp": 1520941696,

"object": {

"_id": {

"$oid": "5aa7ba802c668f27832193d0"

},

"_class": "com.oneiotworld.evbdp.report.model.LRoutineReportData",

"vehicleUuid": "6b59b0d77d9d11e7b91ec850372410e5",

"VIN": "LN86GAAE1HB101109",

"dateTime": {

"$date": 1520941695000

},

"messageType1": "133",

"message1": "20",

"messageType2": "4",

"messageType3": "136",

"type": 15,

"gps": {

"dateTime": {

"$date": 1520941694000

},

"latitude": 22.675356,

"latitude_": "北纬",

"speed": 0,

"longitude": 113.820416,

"longitude_": "东经",

"location_valid": "无效定位",

"direction": "95",

"height": "0"

},

"vehicleStatus": {

"alarmStatus": "00000000",

"lampStatus": "01101000",

"doorStatus": "00000000",

"carLockStatus": "11111000",

"positionStatus": "00000000",

"otherStatus": "00010100"

},

"ubiInfo": {

"instantaneFuleCon": [

137,

15,

12,

12,

12,

12,

12,

12,

12,

12,

12,

12,

11,

11,

10

],

"tripAAvergeFuleCon": 2560,

"tripBAvergeFuleCon": 25344,

"instrumentDisplayMode": 99,

"remianOil": 512,

"totalMileage": 197031,

"rotateSpeed": [

28674,

-14334,

-30973,

28674,

-11006,

-12798,

-12030,

-10238,

-8446,

-5118,

-25854,

-4862,

-6142,

-5374,

-6654

],

"speed": [

-5888,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0

],

"steeringWheelPosition": [

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0

],

"steeringWheelSpeed": [

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0

],

"longitudinalAcceleration": [

0,

0,

0,

0,

16128,

0,

0,

0,

16384,

0,

0,

0,

0,

0,

0

],

"gearPositionSignal": [

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0,

0

],

"tirePressure": {

"leftFrontTirePressureStatusEffectiveFlag": 0,

"leftFrontTirePressureStatus": 1,

"rightFrontTirePressureStatusEffectiveFlag": 1,

"rightFrontTirePressureStatus": 1,

"leftRearTirePressureStatusEffectiveFlag": 1,

"leftRearTirePressureStatus": 1,

"rightRearTirePressureStatusEffectiveFlag": 1,

"rightRearTirePressureStatus": 1,

"leftFrontTirePressure": 1,

"rightFrontTirePressure": 56,

"leftRearTirePressure": 56,

"rightRearTirePressure": 56

}

}

}

}

这样的一个字符串  要给它压成一层  只取有value 对应的key

我写了个递归的方法

public class JsonParsing{

public static void main(String[] args) {

String str = "{timestamp=1520941696, order=107, operation=i, database=leopaard.lRoutineReportData, object={ \"_id\" : { \"$oid\" : \"5aa7ba802c668f27832193d0\" }, \"_class\" : \"com.oneiotworld.evbdp.report.model.LRoutineReportData\", \"vehicleUuid\" : \"6b59b0d77d9d11e7b91ec850372410e5\", \"VIN\" : \"LN86GAAE1HB101109\", \"dateTime\" : { \"$date\" : 1520941695000 }, \"messageType1\" : \"133\", \"message1\" : \"20\", \"messageType2\" : \"4\", \"messageType3\" : \"136\", \"type\" : 15, \"gps\" : { \"dateTime\" : { \"$date\" : 1520941694000 }, \"latitude\" : 22.675356, \"latitude_\" : \"北纬\", \"speed\" : 0.0, \"longitude\" : 113.820416, \"longitude_\" : \"东经\", \"location_valid\" : \"无效定位\", \"direction\" : \"95\", \"height\" : \"0\" }, \"vehicleStatus\" : { \"alarmStatus\" : \"00000000\", \"lampStatus\" : \"01101000\", \"doorStatus\" : \"00000000\", \"carLockStatus\" : \"11111000\", \"positionStatus\" : \"00000000\", \"otherStatus\" : \"00010100\" }, \"ubiInfo\" : { \"instantaneFuleCon\" : [137, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 10], \"tripAAvergeFuleCon\" : 2560.0, \"tripBAvergeFuleCon\" : 25344.0, \"instrumentDisplayMode\" : 99, \"remianOil\" : 512, \"totalMileage\" : 197031, \"rotateSpeed\" : [28674, -14334, -30973, 28674, -11006, -12798, -12030, -10238, -8446, -5118, -25854, -4862, -6142, -5374, -6654], \"speed\" : [-5888, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \"steeringWheelPosition\" : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \"steeringWheelSpeed\" : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \"longitudinalAcceleration\" : [0, 0, 0, 0, 16128, 0, 0, 0, 16384, 0, 0, 0, 0, 0, 0], \"gearPositionSignal\" : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \"tirePressure\" : { \"leftFrontTirePressureStatusEffectiveFlag\" : 0, \"leftFrontTirePressureStatus\" : 1, \"rightFrontTirePressureStatusEffectiveFlag\" : 1, \"rightFrontTirePressureStatus\" : 1, \"leftRearTirePressureStatusEffectiveFlag\" : 1, \"leftRearTirePressureStatus\" : 1, \"rightRearTirePressureStatusEffectiveFlag\" : 1, \"rightRearTirePressureStatus\" : 1, \"leftFrontTirePressure\" : 1, \"rightFrontTirePressure\" : 56, \"leftRearTirePressure\" : 56, \"rightRearTirePressure\" : 56 } }}}";

Mapmap = JSON.parseObject(str);

diguiFunction(map);

}

private static void diguiFunction(Mapmap){

for(Entryentry:Map){

String key = entry.getKey();

Object value = entry.getValue();

if(value instanceof JSONObject){

JSONObject jsonObject = (JSONObject) value;

diguiFunction((Map)jsonObject);

}else if(value instanceof JSONArray){

JSONArray array = (JSONArray)value;

}else{

}

}

}

}

依赖

com.alibaba

fastjson

1.2.7

### Fastjson 解析多层嵌套 JSON 字符串 对于 Java 中使用 Fastjson解析复杂的、多层嵌套的 JSON 数据,通常会涉及到创建相应的实体类来映射 JSON 结构。下面是一个具体的例子说明如何实现这一点。 #### 创建对应的实体类结构 假设有一个如下所示的 JSON 字符串: ```json { "name": "example", "age": 28, "address": { "city": "Beijing", "zipcode": "100000" }, "hobbies": [ {"type": "reading", "level": "advanced"}, {"type": "swimming", "level": "beginner"} ] } ``` 为了能够正确地反序列化上述 JSON 到 Java 对象中,需要定义两个辅助类 `Address` 和 `Hobby` 以及主类 `Person`. ```java public class Address { private String city; private String zipcode; // Getters and Setters... } public class Hobby { private String type; private String level; // Getters and Setters... } public class Person { private String name; private int age; private Address address; private List<Hobby> hobbies; // Getters and Setters... } ``` #### 使用 Fastjson 进行解析 有了这些准备之后,在实际应用里就可以通过调用 Fastjson 的 API 方法轻松完成从 JSON 文本到对象实例的过程: ```java import com.alibaba.fastjson.JSON; // 假设 jsonStr 是上面提到的那个复杂 JSON 字符串 String jsonStr = "..."; // 将 JSON 转换为 Person 类型的对象 Person person = JSON.parseObject(jsonStr, Person.class); ``` 这段代码将会把给定的 JSON 字符串转换成一个完整的 `Person` 实例,并自动填充其内部字段及其关联列表中的元素[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值