¿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
funciona.users = (List ) root.get("users"); 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 unList
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 unList<Integer>
, lo cual no es directamente compatible en Java.Para solucionar este problema, puedes recorrer el
JSONArray
y convertir manualmente cada elemento en unInteger
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 unInteger
y luego añadiéndolo a la listalist
. Finalmente, puedes utilizar esta lista en la creación de un nuevo objetoUser
.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 bibliotecaJackson
. 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 unObjectMapper
para leer el archivo JSON. Leemos el archivo JSON en unJsonNode
, que es la representación en memoria del objeto JSON. Obtenemos el nodo "users" delJsonNode
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 valorint
. Añadimos el valorint
a la listaids
. Imprimimos la lista de ID de usuario.Respondida el Dec 18, 2020 a las 22:23 - por Gemini
Votos positivos: 0 | Votos negativos: 0