JAVA - fastjson 中 JSONObject 的顺序问题

目录

1. JSONObject  存在的默认排序问题一

1.1. 解决方案一

1.2. 解决方案二

2. JSONObject  存在的默认排序问题二

2.1. 解决方案一

2.2. 解决方案二


在使用 fastjson 中的 JSONObject 有时候会遇到数据顺序发生了变化,而实际需求中需要保持原有的顺序。

1. JSONObject  存在的默认排序问题一

JSONObject 初始化时候顺序直接变了

package com;

import com.alibaba.fastjson.JSONObject;

import java.util.LinkedHashMap;
import java.util.Map;

public class TestFastjson {
    public static void main(String[] args) {
        Map<String, Integer> map = new LinkedHashMap<>();
        map.put("c", 1);
        map.put("a", 2);
        map.put("b", 3);
        System.out.println("LinkedHashMap: " + map);

        JSONObject jsonObject = new JSONObject();
        jsonObject.putAll(map);
        System.out.println("JSONObject: " + jsonObject);
    }
}

代码执行结果为:

LinkedHashMap: {c=1, a=2, b=3}
JSONObject: {"a":2,"b":3,"c":1}

可以看出 JSONObject 的顺序并没有保持原来的 LinkedHashMap 的顺序。原因可看源码发现:

JSONObject 初始化的时候调用的是 HashMap,导致不能保持原有的顺序,新的排序结果由 key 决定。

如果需要保持原有的顺序,从此源码中可看出两种解决方案。

1.1. 解决方案一

可以使用 ordered 参数来使用 LinkedHashMap 来初始化 JSONObject。

package com;

import com.alibaba.fastjson.JSONObject;

import java.util.LinkedHashMap;
import java.util.Map;

public class TestFastjson {
    public static void main(String[] args) {
        Map<String, Integer> map = new LinkedHashMap<>();
        map.put("c", 1);
        map.put("a", 2);
        map.put("b", 3);
        System.out.println("LinkedHashMap: " + map);

        JSONObject jsonObject = new JSONObject(true);
        jsonObject.putAll(map);
        System.out.println("JSONObject: " + jsonObject);
    }
}

执行结果

LinkedHashMap: {c=1, a=2, b=3}
JSONObject: {"c":1,"a":2,"b":3}

1.2. 解决方案二

直接使用  LinkedHashMap 来初始化 JSONObject。

package com;

import com.alibaba.fastjson.JSONObject;

import java.util.LinkedHashMap;
import java.util.Map;

public class TestFastjson {
    public static void main(String[] args) {
        Map<String, Integer> map = new LinkedHashMap<>();
        map.put("c", 1);
        map.put("a", 2);
        map.put("b", 3);
        System.out.println("LinkedHashMap: " + map);

        JSONObject jsonObject = new JSONObject(new LinkedHashMap<>());
        jsonObject.putAll(map);
        System.out.println("JSONObject: " + jsonObject);
    }
}

执行结果

LinkedHashMap: {c=1, a=2, b=3}
JSONObject: {"c":1,"a":2,"b":3}

2. JSONObject  存在的默认排序问题二

在使用 JSONObject.parseObject 的时候 JSONObject 顺序变了

package com;

import com.alibaba.fastjson.JSONObject;

import java.util.LinkedHashMap;
import java.util.Map;

public class TestFastjson {
    public static void main(String[] args) {
        Map<String, Integer> map = new LinkedHashMap<>();
        map.put("c", 1);
        map.put("a", 2);
        map.put("b", 3);
        System.out.println("LinkedHashMap: " + map);

        JSONObject jsonObject = new JSONObject(true);
        jsonObject.putAll(map);
        System.out.println("JSONObject: " + jsonObject);

        JSONObject jsonObject1 = JSONObject.parseObject(JSONObject.toJSONString(jsonObject));
        System.out.println("JSONObject1: " + jsonObject1);
    }
}

执行结果

LinkedHashMap: {c=1, a=2, b=3}
JSONObject: {"c":1,"a":2,"b":3}
JSONObject1: {"a":2,"b":3,"c":1}

JSONObject 转成 String 再转回 JSONObject 出现了问题一中的情况,原因可知也是相同的。

2.1. 解决方案一

从源码中可以看到,通过 Feature 可以指定 ParseObject 时候的特征,因此

package com;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;

import java.util.LinkedHashMap;
import java.util.Map;

public class TestFastjson {
    public static void main(String[] args) {
        Map<String, Integer> map = new LinkedHashMap<>();
        map.put("c", 1);
        map.put("a", 2);
        map.put("b", 3);
        System.out.println("LinkedHashMap: " + map);

        JSONObject jsonObject = new JSONObject(true);
        jsonObject.putAll(map);
        System.out.println("JSONObject: " + jsonObject);

        JSONObject jsonObject1 = JSONObject.parseObject(JSONObject.toJSONString(jsonObject), Feature.OrderedField);
        System.out.println("JSONObject1: " + jsonObject1);
    }
}

执行结果

LinkedHashMap: {c=1, a=2, b=3}
JSONObject: {"c":1,"a":2,"b":3}
JSONObject1: {"c":1,"a":2,"b":3}

2.2. 解决方案二

直接使用 JSONArray,略

### 回答1: 将实体类转换为FastJson是在Java使用FastJson库来实现实体类对象与Json字符串之间的相互转换。下面是一个示例: 首先,首先需要引入FastJson的依赖,以及相关的Jackson库: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> ``` 接下来,假设我们有一个实体类Person: ```java public class Person { private String name; private int age; // 省略getter和setter方法 } ``` 我们可以使用FastJson库将Person对象转换为Json字符串: ```java import com.alibaba.fastjson.JSON; public class Main { public static void main(String[] args) { Person person = new Person(); person.setName("Alice"); person.setAge(20); String jsonString = JSON.toJSONString(person); System.out.println(jsonString); } } ``` 上述代码,我们使用`JSON.toJSONString()`方法将Person对象转换为Json字符串。输出的结果为`{"age":20,"name":"Alice"}`。 同样地,我们也可以将Json字符串转换为Person对象: ```java import com.alibaba.fastjson.JSON; public class Main { public static void main(String[] args) { String jsonString = "{\"age\":20,\"name\":\"Alice\"}"; Person person = JSON.parseObject(jsonString, Person.class); System.out.println(person.getName()); System.out.println(person.getAge()); } } ``` 上述代码,我们使用`JSON.parseObject()`方法将Json字符串转换为Person对象。输出的结果为: ``` Alice 20 ``` 总结:通过上述示例,我们可以看到使用FastJson可以很方便地实现实体类对象与Json字符串之间的转换。只需要引入FastJson的依赖以及Jackson库,就可以进行转换操作。 ### 回答2: 在Java,我们可以使用Fastjson库将实体类转换为JSON字符串。Fastjson是一个高性能的Java JSON处理器,可以快速将Java对象转换为JSON字符串。 要将实体类转换为Fastjson,我们需要按照以下步骤进行操作: 1. 导入Fastjson库。在项目,我们需要先将Fastjson库添加到项目的依赖。可以在Maven或Gradle配置文件添加相关依赖项。 2. 创建一个实体类。假设我们的实体类名为Person,它具有一些属性,如姓名、年龄等。 3. 在代码创建Person对象,并设置相应的属性值。 4. 使用Fastjson将Person对象转换为JSON字符串。可以通过调用Fastjson库提供的相关API,如toJSONString()方法,将Person对象转换为JSON字符串。例如,String jsonString = JSON.toJSONString(person); 5. 打印或处理生成的JSON字符串。可以将生成的JSON字符串打印出来,或者根据需要进行其他处理,如存储到文件。 通过以上步骤,我们可以将实体类转换为JSON字符串,然后可以根据需要进行后续的操作,如传递给其他系统、存储到数据库等。 需要注意的是,Fastjson默认情况下按照实体类的属性顺序来生成JSON字符串,如果需要按照自定义的顺序生成JSON字符串,可以在实体类使用注解或配置指定属性的顺序。此外,Fastjson还支持将JSON字符串转换回Java对象的功能,可以方便地在Java程序进行JSON数据的读取和解析操作。 ### 回答3: 将实体类转换为Fastjson可以通过以下步骤实现: 首先,确保已经引入Fastjson库。可以通过在pom.xml文件添加以下依赖项来引入Fastjson: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>x.x.x</version> </dependency> ``` 其,x.x.x是Fastjson库的版本号。 接下来,需要将实体类的属性和对应的值转换为FastjsonJSONObject对象。可以通过创建一个新的JSONObject对象,并使用put方法将属性和值添加到JSONObject: ```java import com.alibaba.fastjson.JSONObject; public class Entity { private String name; private int age; // getter and setter methods public JSONObject toJSON() { JSONObject json = new JSONObject(); json.put("name", this.name); json.put("age", this.age); return json; } } ``` 上述代码,toJSON方法将实体类的属性和对应的值添加到JSONObject对象,并返回该JSONObject对象。 最后,可以通过调用toJSON方法,将实体类转换为Fastjson的JSON对象: ```java public class Main { public static void main(String[] args) { Entity entity = new Entity(); entity.setName("John"); entity.setAge(25); JSONObject json = entity.toJSON(); System.out.println(json.toJSONString()); } } ``` 上述代码,首先创建一个实体类的实例entity,并设置其属性值。然后,调用entity的toJSON方法,将实体类转换为FastjsonJSONObject对象。最后,通过调用JSON对象的toJSONString方法,将JSON对象转换为字符串,并打印输出。 以上就是将实体类转换为Fastjson的一个简单示例。实际使用,根据实体类的属性情况,可以灵活地使用Fastjson提供的方法来实现转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Encarta1993

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值