Cuando com.alibaba.fastjson.JSONObject realiza un bucle para asignar valores al mismo objeto, aparecerá "$ref":"$[0]".

1. Introducción al problema

En algunos escenarios, elegiremos usar JSONObject en lugar de Map para procesar la lógica de negocios, pero hay algo a tener en cuenta al usar JSONObject: al procesar objetos JSONObject, el com.alibaba.fastjson.JSONObject al que se hace referencia está en una colección y se repite en bucle Al asignar este objeto, aparecerá "$ref":" $ [0]". Se considerará un objeto y aparecerá $ref.

Insertar descripción de la imagen aquí

2. Cómo resolver el problema de referencia repetida del objeto $ref en fastjson

FastJson proporciona la opción de serialización SerializerFeature.DisableCircularReferenceDetect para desactivar la detección de referencias.
Después de desactivar la detección de referencias, las referencias repetidas a objetos no serán reemplazadas por $ref, pero las referencias circulares también provocarán excepciones StackOverflowError.

Ejemplo: JSON.toJSONString(objeto, SerializerFeature.DisableCircularReferenceDetect);

3. Da ejemplos

Información de una clase, dos estudiantes, ahora se requieren todos los estudiantes, cada estudiante regresa con su propio conjunto de información completa:

public static void main(String[] args) {
    
    
        JSONObject base=new JSONObject();
        base.put("class_info", "班级信息");

        List<String> userNames=new ArrayList();
        JSONObject programs = new JSONObject();
        userNames.add("学生一");
        userNames.add("学生二");
        if (!CollectionUtils.isEmpty(userNames)) {
    
    
            for (String name : userNames) {
    
    
                JSONObject baseInfo = base;
                baseInfo.put("user_name", name);
                programs.put(name, baseInfo);
            }
            log.info("=====关闭引用检测前===:{}",JSON.toJSON(programs));
            programs = JSON.parseObject(JSON.toJSONString(programs, SerializerFeature.DisableCircularReferenceDetect));
            log.info("=====多关闭引用检测后===:{}",JSON.toJSON(programs));
        }
    }

Resultado de salida:

Puede ver antes de desactivar la detección de referencia:

{
    
    
    "学生一":{
    
    
        "user_name":"学生二",
        "class_info":"班级信息"
    },
    "学生二":{
    
    
        "$ref":"$.学生一"
    }
}

Después de cerrar múltiples verificaciones de referencias:

{
    
    
    "学生一":{
    
    
        "user_name":"学生二",
        "class_info":"班级信息"
    },
    "学生二":{
    
    
        "user_name":"学生二",
        "class_info":"班级信息"
    }
}

Obviamente, la inicialización de los programas JSONObject está fuera del ciclo y se considera un objeto, por lo que aparece $ ref. En nuestra colección final, queremos colocar dos JSONObjects de información de los estudiantes en la lista. Así que simplemente desactive la detección de referencia. Por supuesto, también puede colocar la inicialización de JSONObject en el bucle for, por lo que no es necesario desactivar la detección.
Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_47061482/article/details/132184746
Recomendado
Clasificación