es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo convertir JSON de campos con valores en Arrays en una lista tipada de una clase personalizada.

Estoy tratando de deserializar json en mi clase usando la biblioteca “jackson-databind” de Java. El json tiene el siguiente formato:

sample.json

{ 
    ...,
    "random" : { 
        "field1" : ["x1","y1","z1","a1","b1"],
        "field2" : ["x2","y2","z2","a2","b2"],
        "field3" : ["x3","y3","z3","a3","b3"]
    }
}

Quiero leer este json en una lista de tipo List<myclass> llamada myList, con tamaño 5 [xMy,yMy,zMy,aMy,bMy]. La clase MyClass tiene los atributos: String field1, String field2, String field3. El elemento xMy debe tener una lista de [x1, x2, x3]. yMy debe tener una lista de [y1, y2, y3]. zMy debe tener una lista de [z1, z2, z3].

public class MyClass {
    private String field1;
    private String field2;
    private String field3;
    ...
}

Por lo tanto, la variable de resultado será List<myclass> myList.

Código UltraSmartLogic.java

JsonNode node = new ObjectMapper().readTree(json);
JsonNode randomNode = node.get("random");
ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<><string>>() {});
List<string> field1ValueList = reader.readValue(randomNode.get("field1"));
List<myclass> myList = ???

Este es solo un json simplificado, el json real contiene 7 campos y 1000 valores para cada campo. El objetivo aquí es crear 1000 instancias de MyClass dentro de myList. El primer elemento debe estar mapeado con x1, x2, x3, el segundo elemento debe estar mapeado con y1, y2, y3, el tercero con z1, z2, z3, y así sucesivamente mil veces…

field1ValueList no se usa, porque de esta manera tendría 7 variables de tipo List y 7 bucles for iterando 1000 veces cada uno, más otro bucle para asignar valores a List<myclass> myList. Creo que jackson es más efectivo y capaz de deserializar esto, solo que no sé cómo. Por ahora.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puedes usar JsonNode de Jackson para navegar el árbol JSON y extraer los valores para cada instancia de MyClass. Aquí tienes un ejemplo de fragmento de código que debería ayudarte:

    JsonNode node = new ObjectMapper().readTree(json);
    JsonNode randomNode = node.get("random");
    
    List<myclass> myList = new ArrayList<>();
    int numFields = 3; // número de campos en MyClass
    int numValues = 1000; // número de valores para cada campo
    
    for (int i = 0; i < numValues; i++) {
        MyClass myClass = new MyClass();
        for (int j = 1; j <= numFields; j++) {
            String fieldName = "field" + j;
            JsonNode fieldValueNode = randomNode.get(fieldName);
            String fieldValue = fieldValueNode.get(i).asText();
            switch (j) {
                case 1:
                    myClass.setField1(fieldValue);
                    break;
                case 2:
                    myClass.setField2(fieldValue);
                    break;
                case 3:
                    myClass.setField3(fieldValue);
                    break;
                default:
                    break;
            }
        }
        myList.add(myClass);
    }
    

    Este código inicializa una lista myList vacía y luego itera sobre los 1000 valores de cada campo en el JSON. Para cada iteración, crea una nueva instancia de MyClass y luego itera sobre los tres campos, extrayendo el valor correspondiente del nodo JSON y configurándolo en el campo apropiado de la instancia de MyClass. Finalmente, se agrega la instancia de MyClass a myList.

    Nota que esto asume que el JSON está bien formado y que no faltan ni hay campos/valores inesperados. Es posible que necesites agregar un manejo de errores si el JSON puede variar en su estructura.

Comments are closed.