From 48a626eb3ec1a8149bb567c777f3bc200416ac8d Mon Sep 17 00:00:00 2001 From: frizz19 Date: Sun, 14 Jun 2026 20:13:57 +0800 Subject: [PATCH] fix: NameFilter returning null causes Map keys to serialize as null (#7644) When NameFilter.process() returns null for a Map entry key in ObjectWriterImplMap, the key was overwritten with null and serialized as `null:value` instead of preserving the original key. Add a null guard so that a null return value falls back to the original key, consistent with the behavior in ObjectWriterAdapter (POJO fields) and JSONObject.nameFilter(). Fixes #7644 --- .../fastjson2/writer/ObjectWriterImplMap.java | 5 ++- .../fastjson2/issues_7000/Issue7644.java | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 core/src/test/java/com/alibaba/fastjson2/issues_7000/Issue7644.java diff --git a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterImplMap.java b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterImplMap.java index 8e391bd230..695a4411d4 100644 --- a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterImplMap.java +++ b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterImplMap.java @@ -674,7 +674,10 @@ public void writeWithFilter(JSONWriter jsonWriter, Object object, Object fieldNa } if (nameFilter != null) { - key = nameFilter.process(object, key, value); + String filteredKey = nameFilter.process(object, key, value); + if (filteredKey != null) { + key = filteredKey; + } } if (propertyFilter != null) { diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_7000/Issue7644.java b/core/src/test/java/com/alibaba/fastjson2/issues_7000/Issue7644.java new file mode 100644 index 0000000000..587cf5714e --- /dev/null +++ b/core/src/test/java/com/alibaba/fastjson2/issues_7000/Issue7644.java @@ -0,0 +1,32 @@ +package com.alibaba.fastjson2.issues_7000; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.filter.NameFilter; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class Issue7644 { + @Test + public void testNameFilterNullReturnPreservesMapKey() { + Map map = new LinkedHashMap<>(); + map.put("aaaa", "value"); + + NameFilter nameFilter = (object, name, value) -> null; + + assertEquals("{\"aaaa\":\"value\"}", JSON.toJSONString(map, nameFilter)); + } + + @Test + public void testNameFilterReturnValueRenamesMapKey() { + Map map = new LinkedHashMap<>(); + map.put("aaaa", "value"); + + NameFilter nameFilter = (object, name, value) -> "renamed_" + name; + + assertEquals("{\"renamed_aaaa\":\"value\"}", JSON.toJSONString(map, nameFilter)); + } +}