Skip to content

Commit

Permalink
Fix ClassCastException caused by using ValueFilter in Boolean/Short t…
Browse files Browse the repository at this point in the history
…ype fields, for issue #3076 (#3077)

* nextIfComma supports ignoring all white space chars, for issue #2164

* Fix ClassCastException caused by using ValueFilter in Boolean/Short type fields, for issue #3076
  • Loading branch information
rowstop authored Oct 12, 2024
1 parent 3de60a9 commit b05c4f1
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,9 @@ public boolean write(JSONWriter jsonWriter, Object object) {

@Override
public ObjectWriter getObjectWriter(JSONWriter jsonWriter, Class valueClass) {
return ObjectWriterImplBoolean.INSTANCE;
if (valueClass == fieldClass) {
return ObjectWriterImplBoolean.INSTANCE;
}
return jsonWriter.getObjectWriter(valueClass);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ public void writeValue(JSONWriter jsonWriter, T object) {

@Override
public ObjectWriter getObjectWriter(JSONWriter jsonWriter, Class valueClass) {
return ObjectWriterImplInt16.INSTANCE;
if (valueClass == fieldClass) {
return ObjectWriterImplInt16.INSTANCE;
}
return jsonWriter.getObjectWriter(valueClass);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.alibaba.fastjson2.issues_3000;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.filter.ValueFilter;
import lombok.Data;
import lombok.SneakyThrows;
import org.junit.jupiter.api.Test;
import org.skyscreamer.jsonassert.JSONAssert;

/**
* @author 张治保
* @since 2024/10/9
*/
public class Issue3076 {
@SneakyThrows
@Test
void test() {
User user = new User("Alice", null, null);
// 定义一个 ValueFilter,将 null 值修改为默认值
ValueFilter filter = (object, name, value) -> {
if (value == null) {
return "N/A"; // 如果字段值为 null,改为 "N/A"
}
return value;
};

// 使用 ValueFilter 序列化
String jsonString = JSON.toJSONString(user, filter, JSONWriter.Feature.WriteNulls);
// 输出:{"name":"Alice","age":"N/A","active":"N/A"}
JSONAssert.assertEquals(
"{\"name\":\"Alice\",\"age\":\"N/A\",\"active\":\"N/A\"}",
jsonString,
true
);
}

@Data
static class User {
private String name;
private Integer age;
private Boolean active;

public User(String name, Integer age, Boolean active) {
this.name = name;
this.age = age;
this.active = active;
}
}
}

0 comments on commit b05c4f1

Please sign in to comment.