¿Cómo puedo leer valores int de archivo json en Java?

Quiero tomar "ids" y asignarlo a un arraylist. config.json file is here:


{

  "users":[
  {"user id":1,"user name":"A","user type":"bot1", "ids": [1 ,2]},
  {"user id":2,"user name":"B","user type":"bot2","ids": [1 ,2]},
  {"user id":3,"user name":"C","user type":"bot3","ids": [2 ,3]}
  ]
}

Para leer este archivo json he probado esto:

JSONArray jsonArrayForUsers = (JSONArray) jsonObject.get("users");
            
            for (int i=0; i list =  Arrays.asList(jsonDatasetIds);// Trying to covert JSONArray into an array but error occurs
 
//Type mismatch: cannot convert from List to List
                
                
                users.add(new User((int)userId, userName, userType,list));
            }

Podría leer "user id", "user name" , "user type" correctamente. Pero no sé cómo leer -"ids": [1 ,2]- parte y crear un arraylist de ella.

Editar: Problema resuelto después de que haya cambiado

               //It should've been 'obj2.get()'
               JSONArray  jsonDatasetIds = (JSONArray) obj2.get("ids");

               
               for(int a = 0; i

Pero ahora no puedo añadir valores de 'jsonDatasetIds' a 'list'. En otras palabras, no puedo tomar valores de JSONArray.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por debugdynamo


3 Respuestas:

  • Hay muchas maneras de mejorar el código, empecemos por reformular el problema: Necesitas ir de una cadena JSON a un objeto modelo con todos los atributos mapeados.

    Hay buenas bibliotecas para hacer esto, como Jackson y Gson, pero también se puede hacer con json-simple 1.1.1 como estás haciendo.

    Suponiendo que su objeto modelo se vea así:

    public class User {
        private int id;
        private String name;
        private String type;
        private List ids;
    
        // and constructor + getters + setters
    }
    

    Y a partir del JSON usted proporcionó:

    {
      "users":[
        {"user id":1, "user name":"A", "user type":"bot1", "ids":[1, 2]},
        {"user id":2, "user name":"B", "user type":"bot2", "ids":[1, 2]},
        {"user id":3, "user name":"C", "user type":"bot3", "ids":[2, 3]}
      ]
    }
    

    Podemos hacer un primer intento que se parezca a esto:

    public static void main(String[] args) throws ParseException {
        String json =
                "{  \"users\":[" +
                "  {\"user id\":1,\"user name\":\"A\",\"user type\":\"bot1\", \"ids\": [1 ,2]}," +
                "  {\"user id\":2,\"user name\":\"B\",\"user type\":\"bot2\",\"ids\": [1 ,2]}," +
                "  {\"user id\":3,\"user name\":\"C\",\"user type\":\"bot3\",\"ids\": [2 ,3]}" +
                "  ]" +
                "}";
                
        List result = new ArrayList<>();
    
        JSONParser parser = new JSONParser();
        JSONObject root = (JSONObject) parser.parse(json);
        List users = (List) root.get("users");
    
        for (JSONObject user: users) {
            List userIds = new ArrayList<>();
            for (Long id : (List) user.get("ids")) {
                userIds.add(id.intValue());
            }
    
            result.add(new User(((Long)user.get("user id")).intValue(), (String) user.get("user name"), (String) user.get("user type"), userIds));
        }
    
        System.out.println(result);
    }
    

    Como puede ver un JSONArray puede ser lanzado directamente a una Lista, y si miramos la firma de la clase JSONArray podemos entender por qué:

    public class JSONArray extends ArrayList implements List, JSONAware, JSONStreamAware
    

    JSONArray en realidad extiende Array Lista para que no necesite crear uno nuevo y por eso la línea List users = (List) root.get("users"); funciona.

    Ahora que usted tiene una lista de su posible para iterar sobre los elementos con el bucle de anteceso habitual for (JSONObject user: users) {...} y procesar cada elemento.

    Para los "ids" internos podríamos hacer lo mismo, pero desde su código parece que los ids deben ser enteros y json-simple retornos Long objetos, por lo que necesitamos convertirlos y es por eso que el segundo lazo está allí (si el objeto modelo acepta un List no sería necesario).

    Una manera diferente de hacer lo mismo es con las secuencias de java 8, especificando los diferentes pasos que necesita para convertir el objeto fuente en el destino uno:

    public static void main(String[] args) throws ParseException {
        String json =
                "{  \"users\":[" +
                "  {\"user id\":1,\"user name\":\"A\",\"user type\":\"bot1\", \"ids\": [1 ,2]}," +
                "  {\"user id\":2,\"user name\":\"B\",\"user type\":\"bot2\",\"ids\": [1 ,2]}," +
                "  {\"user id\":3,\"user name\":\"C\",\"user type\":\"bot3\",\"ids\": [2 ,3]}" +
                "  ]" +
                "}";
        
        JSONParser parser = new JSONParser();
        JSONObject root = (JSONObject) parser.parse(json);
        
        List result = ((List)root.get("users"))
                .stream()
                .map(user -> new User(
                    ((Long)user.get("user id")).intValue(),
                    (String) user.get("user name"),
                    (String) user.get("user type"),
                    ((List) user.get("ids"))
                            .stream()
                            .map(Long::intValue)
                            .collect(Collectors.toList())))
                .collect(Collectors.toList());
    
    
        System.out.println(result);
    }
    

    En mi opinión, streaming api es más claro en situaciones cuando se necesita ir paso a paso transformando una lista de objetos de un tipo a otro, en este ejemplo no hace mucha diferencia, pero en situaciones más complejas con muchos pasos intermedios puede ser una herramienta muy útil.

    Respondida el Dec 17, 2020 a las 22:13 - por logiclinguist

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando se debe a que estás tratando de convertir directamente un JSONArray en un List<Integer>, lo cual no es directamente compatible en Java.

    Para solucionar este problema, puedes recorrer el JSONArray y convertir manualmente cada elemento en un Integer antes de añadirlo a la lista. Aquí te dejo un ejemplo de cómo puedes hacerlo:

    java
    JSONArray jsonDatasetIds = (JSONArray) obj2.get("ids");
    List list = new ArrayList<>();
    for (int a = 0; a < jsonDatasetIds.size(); a++) {
        list.add(jsonDatasetIds.getInt(a));
    }
    
    // Agregar los valores a la lista
    users.add(new User((int) userId, userName, userType, list));
    

    Con este código, estás recorriendo el JSONArray jsonDatasetIds, convirtiendo cada valor en un Integer y luego añadiéndolo a la lista list. Finalmente, puedes utilizar esta lista en la creación de un nuevo objeto User.

    Espero que esta solución te haya ayudado a resolver tu problema. Si tienes alguna otra pregunta, no dudes en decírmelo.

    Respondida el Dec 18, 2020 a las 22:11 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para leer valores int de un archivo JSON en Java, puedes utilizar la biblioteca Jackson. A continuación se muestra un ejemplo de cómo hacerlo:

    ```java import com.fasterxml.jackson.databind.ObjectMapper;

    import java.io.File; import java.util.ArrayList; import java.util.List;

    public class ReadJsonIntValues {

    public static void main(String[] args) {
        try {
            // Crear un ObjectMapper para leer el archivo JSON
            ObjectMapper mapper = new ObjectMapper();
    
            // Leer el archivo JSON en un objeto `JsonNode`
            JsonNode rootNode = mapper.readTree(new File("config.json"));
    
            // Obtener el nodo "users"
            JsonNode usersNode = rootNode.get("users");
    
            // Crear una lista para almacenar los ID de usuario
            List<Integer> ids = new ArrayList<>();
    
            // Iterar a través del nodo "users"
            for (JsonNode userNode : usersNode) {
                // Obtener el nodo "ids"
                JsonNode idsNode = userNode.get("ids");
    
                // Iterar a través del nodo "ids"
                for (JsonNode idNode : idsNode) {
                    // Obtener el valor `int` del nodo "id"
                    int id = idNode.asInt();
    
                    // Añadir el valor `int` a la lista
                    ids.add(id);
                }
            }
    
            // Imprimir la lista de ID de usuario
            System.out.println(ids);
        } catch (Exception e) {
            // Manejar la excepción
            e.printStackTrace();
        }
    }
    

    } ```

    Explicación:

    Importamos la biblioteca Jackson y las clases necesarias. Creamos un ObjectMapper para leer el archivo JSON. Leemos el archivo JSON en un JsonNode, que es la representación en memoria del objeto JSON. Obtenemos el nodo "users" del JsonNode raíz. Iteramos a través del nodo "users" y obtenemos el nodo "ids" para cada usuario. Iteramos a través del nodo "ids" y convertimos cada nodo "id" a un valor int. Añadimos el valor int a la lista ids. Imprimimos la lista de ID de usuario.

    Respondida el Dec 18, 2020 a las 22:23 - por Gemini

    Votos positivos: 0 | Votos negativos: 0