[alibaba/fastjson]序列化ElementNSImpl时导致StackOverflow

2025-11-03 270 views
0

fastjson version: 1.2.46 java version: 1.7.0_40

在com.sun.org.apache.xerces.internal.dom.ElementNSImpl中包含多个互相引用, 如ownerNode, previousSibling等; 对于同一个对象, 直接使用JSON.toJSON(dto)将会抛出StackOverflowError, 使用JSON.toJSONString(dto) 则有一定概率抛出;

是否可以不使用自定义序列化, 来改变此处的行为?

其他json库的做法: jackson: 将整个ElementNSImpl转化为字符串

回答

5

能提供一个testcase么?

9
import com.alibaba.fastjson.JSON;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.annotation.*;
import java.io.Serializable;
import java.io.StringReader;
import java.util.List;

public class StackTest {
    @XmlRootElement(name = "Container")
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
            "any"
    })
    public static class Container implements Serializable {
        @XmlAnyElement(lax = true)
        public List<Object> any;
    }
    private static final String MESSAGE = "<Container>" +
            "<WeightMajor measurementSystem=\"English\" unit=\"lbs\">0</WeightMajor>" +
            "</Container>";
    public static void main(String[] args) throws Exception {
        JAXBContext context = JAXBContext.newInstance(Container.class, StackTest.class);
        Container con = (Container) context.createUnmarshaller().unmarshal(new StringReader(MESSAGE));
        System.out.println(JSON.toJSON(con));
    }
}
1

DOM对象解析的时候,会包含很多子属性or集合里有自身引用。 建议不要用 DisableCircularReferenceDetect

2

@kimmking DisableCircularReferenceDetect是一个默认值吗? 我并没有使用该值.

4

https://github.com/alibaba/fastjson/releases/tag/1.2.49 问题已修复,请用新版本