使用Gson将Object转String出现\u003d 的原因

本文介绍了一个关于Gson转码导致的问题,即在使用Gson将对象转换为JSON字符串时,等号(=)被错误地转码为u003d。文章详细解释了问题产生的原因,并提供了解决方案,通过创建一个不进行HtmlEscaping的Gson对象来避免转码。

情况:

​​​​​​​​​​​​​​
跟后台交互的时候,发现传过去的数据中有个 \u003d
这是我传的参数 :

query=[{property:"chengShi.id",operator:"=",value:1}]

这是后台接收到的参数:

query=[{"property":"chengShi.id","value":1,"operator":"\u003d"}]

很明显,是 = 出错了,因为要传的是对象,我把它封装在Map中了,再用Gson转换,这是我的代码:

Map query = new HashMap();
        query.put("property", "shangPinDM");
        query.put("operator", "=");
        query.put("value", id);
OkHttpGo.<String>post(API.CHECK_PRODUCT)
                .params("query", "[" + MyJson.toJson(query) + "]")
                .execute(new DialogCallback<String>(this).......

​​​​​​​​​

注意这段代码 MyJson.toJson(query),MyJson中封装的是Gson。所以问题就出在Gson转换过程中。

原因:

​​​​​​​Gson默认是进行HTML ESCAPE,也就是转码, 比如我们 \t 表示换行符。因此对象中有=时,Gson就会把=转码,而 = 转码就是 \u003d 。如下图,使用站长之家的在线转换工具可以看到 = 转成Unicode编码之后就是 \u003d

解决

既然Gson默认会进行HTML ESCAPE(转码),我们设置不让Gson转码就可以了,具体代码如下:

  // 创建一个不进行HtmlEscaping的Gson对象
  Gson gson = new GsonBuilder().disableHtmlEscaping().create();
  String json = gson.toJson(query);

原文地址​​​​​​​

<think>我们使用Gson库将Java对象换为JSON字符串。首先,确保已经添加了Gson依赖。 步骤: 1. 创建Gson实例(或使用GsonBuilder进行自定义配置) 2. 调用Gson的toJson方法,传入要换的对象 示例代码: 假设有一个Person类: ```java public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } } ``` 换代码: ```java import com.google.gson.Gson; public class Main { public static void main(String[] args) { // 创建对象 Person person = new Person("Alice", 25); // 创建Gson实例 Gson gson = new Gson(); // 将对象换为JSON字符串 String json = gson.toJson(person); System.out.println(json); // 输出:{"name":"Alice","age":25} } } ``` 如果需要自定义换(比如日期格式、字段排除等),可以使用GsonBuilder: ```java Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd HH:mm:ss") // 设置日期格式 .excludeFieldsWithoutExposeAnnotation() // 排除没有@Expose注解的字段 .create(); ``` 注意:如果对象中包含复杂结构(如嵌套对象、集合等),Gson也能正确处理。 另外,在Kotlin中的使用方式类似: ```kotlin data class Person(val name: String, val age: Int) fun main() { val person = Person("Bob", 30) val gson = Gson() val json = gson.toJson(person) println(json) // {"name":"Bob","age":30} } ``` 如果遇到循环引用,Gson默认会抛出StackOverflowError,可以通过.serializeNulls()和.excludeFieldsWithModifiers()等配置避免,或者使用@Expose注解和transient关键字控制序列化字段。 最后,记得处理异常情况,比如对象为null时,Gson换成"null"字符串。 §§相关问题§§ 1. 如何使用GsonJSON字符串换回Java对象? 2. 在Gson中如何排除某些字段参与序列化? 3. 使用Gson序列化对象时如何处理日期格式? 4. Gson在序列化过程中遇到循环引用问题该如何解决? 5. 如何配置Gson使其输出格式化的JSON字符串(带缩进)?</think>### 使用 Gson 将 Java 对象换为 JSON 字符串的完整指南 Gson 是 Google 提供的强大 JSON 库,用于实现 Java 对象与 JSON 数据之间的相互换。以下是对象字符串的详细方法: #### 1. **基础换方法** ```java // 创建对象实例 User user = new User("张三", 25, "zhangsan@example.com"); // 创建 Gson 实例 Gson gson = new Gson(); // 对象 JSON 字符串 String json = gson.toJson(user); // 输出结果 System.out.println(json); // {"name":"张三","age":25,"email":"zhangsan@example.com"} ``` #### 2. **自定义换配置** ```java // 使用 GsonBuilder 自定义配置 Gson gson = new GsonBuilder() .setPrettyPrinting() // 格式化输出 .serializeNulls() // 序列化 null 值 .setDateFormat("yyyy-MM-dd HH:mm:ss") // 日期格式 .create(); // 换对象 String formattedJson = gson.toJson(user); /* 输出格式: { "name": "张三", "age": 25, "email": "zhangsan@example.com" } */ ``` #### 3. **处理复杂对象** ```java // 包含嵌套对象的类 class Order { String orderId; List<Product> products; User user; } // 换复杂对象 Order order = new Order("ORD-123", productsList, user); String orderJson = gson.toJson(order); ``` #### 4. **排除字段的三种方法** ```java // 方法1:使用 transient 关键字 class User { private String name; private transient String password; // 被序列化 } // 方法2:使用 @Expose 注解 class User { @Expose private String name; @Expose(serialize = false) private String password; // 仅反序列化 } // 方法3:自定义策略 Gson gson = new GsonBuilder() .excludeFieldsWithoutExposeAnnotation() .create(); ``` #### 5. **处理集合和数组** ```java // 列表 JSON List<User> userList = Arrays.asList(user1, user2); String listJson = gson.toJson(userList); // 数组 JSON User[] userArray = {user1, user2}; String arrayJson = gson.toJson(userArray); ``` #### 6. **性能优化建议** 1. 重用 Gson 实例(避免重复创建) 2. 对静态字段使用 `@SerializedName` 注解 3. 复杂场景使用 `TypeToken` 处理泛型 ```java Type listType = new TypeToken<List<User>>(){}.getType(); String json = gson.toJson(userList, listType); ``` #### 常见问题解决方案: 1. **日期格式化**:使用 `setDateFormat()` 或自定义序列化器 2. **枚举处理**:默认输出枚举名称,可通过 `@SerializedName` 定制 3. **循环引用**:使用 `@Expose` 排除或实现自定义序列化器 4. **特殊字符**:Gson 自动处理 Unicode
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值