Wie konvertiert man eine JSON-Zeichenfolge in eine Liste von Java-Objekten?

Lesezeit: 4 Minuten

Benutzer-Avatar
Nacht

Dies ist mein JSON-Array: –

[ 
    {
        "firstName" : "abc",
        "lastName" : "xyz"
    }, 
    {
        "firstName" : "pqr",
        "lastName" : "str"
    } 
]

Ich habe dies in meinem String-Objekt. Jetzt möchte ich es in ein Java-Objekt konvertieren und in der Liste des Java-Objekts speichern. zB In Student-Objekt. Ich verwende den folgenden Code, um ihn in eine Liste von Java-Objekten zu konvertieren: –

ObjectMapper mapper = new ObjectMapper();
StudentList studentList = mapper.readValue(jsonString, StudentList.class);

Meine Listenklasse ist: –

public class StudentList {

    private List<Student> participantList = new ArrayList<Student>();

    //getters and setters
}

Mein Student-Objekt ist: –

class Student {

    String firstName;
    String lastName;

    //getters and setters
}

Übersehe ich hier etwas? Ich bekomme die folgende Ausnahme: –

Exception : com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.aa.Student out of START_ARRAY token

  • Sie versuchen zu deserialisieren List hinein Student

    – Tschüss

    16. Juni 2017 um 12:36 Uhr

  • Speziell: mapper.readValue(jsonString, Student.class) serialisiert einen Schüler, nicht „einen Schüler oder eine Liste von Schülern, wenn der json wie eine Liste aussieht“. Sie sollten eine verwenden TypeReference.

    – yshavit

    16. Juni 2017 um 12:38 Uhr

  • @yshavit: -Ich habe die Frage aktualisiert. Das tut mir leid. Bitte schauen Sie sich das noch einmal an.

    – Nitesh

    16. Juni 2017 um 12:42 Uhr

  • Ihr JSON sieht nicht so aus {"participantList" : []}. Das ist, was der Fehler Ihnen sagen will

    – OneCricketeer

    16. Juni 2017 um 12:43 Uhr


  • Hier ist eine funktionierende Lösung extrahieren Sie Daten aus dem JSON-String-Array

    – Mehul Boghra

    20. April 2020 um 11:06 Uhr

Benutzer-Avatar
Manos Nikolaidis

Sie bitten Jackson, a zu analysieren StudentList. Sagen Sie ihm, er soll a analysieren List (von Studenten) statt. Seit List generisch ist, verwenden Sie normalerweise a TypeReference

List<Student> participantJsonList = mapper.readValue(jsonString, new TypeReference<List<Student>>(){});

  • perfekte Antwort. Funktioniert immer. Aber ich habe eine Anschlussfrage. Was ist, wenn Student POJO eine verschachtelte Hashmap-Struktur hat und jsonString ein Stück hat, das dieser verschachtelten Hashmap zugeordnet werden sollte? Kann jemand sagen, wie ich das erreichen kann?

    – old_soul_on_the_run

    9. Dezember 2019 um 20:28 Uhr

  • Nun, ich verstand, was ich erreichen wollte. Ich musste die JSON-Struktur ändern (wozu ich die Freiheit hatte). [ { “id”: “1”, “name”: “XYZ”, “thisHasToBeHashMap” : { “key1” : “value1” , “key2″ :”value2” } }] Diese Struktur wird implizit mit TypeReference> konvertiert

    – old_soul_on_the_run

    9. Dezember 2019 um 21:09 Uhr


  • Es kann zu vereinfacht werden List<Student> participantJsonList = mapper.readValue(jsonString, new TypeReference<>(){});

    – Kxrr

    2. April um 6:34

Benutzer-Avatar
Sobhan

Für alle, die noch nach Antworten suchen:

1.Hinzufügen jackson-databind Bibliothek zu Ihren Build-Tools wie Gradle oder Maven

2. in Ihrem Code:

ObjectMapper mapper = new ObjectMapper();

List<Student> studentList = new ArrayList<>();

studentList = Arrays.asList(mapper.readValue(jsonStringArray, Student[].class));

Sie können für dieses Szenario auch Gson verwenden.

Gson gson = new Gson();
NameList nameList = gson.fromJson(data, NameList.class);

List<Name> list = nameList.getList();

Ihre NameList-Klasse könnte wie folgt aussehen:

class NameList{
 List<Name> list;
 //getter and setter
}

  • Diese Lösung ist einfacher StackOverflow. Es verwenden TypeToken Klasse.

    – HRoux

    2. Oktober 2018 um 17:23 Uhr


Sie können die folgende Klasse verwenden, um die Liste der Objekte zu lesen. Es enthält eine statische Methode zum Lesen einer Liste mit einem bestimmten Objekttyp. Es sind Jdk8Module-Änderungen enthalten, die auch neue Zeitklassen unterstützen. Es ist eine saubere und generische Klasse.

List<Student> students = JsonMapper.readList(jsonString, Student.class);

Generische JsonMapper-Klasse:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.io.IOException;
import java.util.*;

import java.util.Collection;

public class JsonMapper {

    public static <T> List<T> readList(String str, Class<T> type) {
        return readList(str, ArrayList.class, type);
    }

    public static <T> List<T> readList(String str, Class<? extends Collection> type, Class<T> elementType) {
        final ObjectMapper mapper = newMapper();
        try {
            return mapper.readValue(str, mapper.getTypeFactory().constructCollectionType(type, elementType));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private static ObjectMapper newMapper() {
        final ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.registerModule(new JavaTimeModule());
        mapper.registerModule(new Jdk8Module());
        return mapper;
    }
}

StudentList studentList = mapper.readValue(jsonString,StudentList.class);

Ändern Sie dies zu diesem

StudentList studentList = mapper.readValue(jsonString, new TypeReference<List<Student>>(){});

Benutzer-Avatar
javaBitte42

Ich habe unten eine Methode erstellt, um dies zu tun jsonArrayToObjectList. Es ist eine praktische statische Klasse, die einen Dateinamen akzeptiert und die Datei ein Array in JSON-Form enthält.

 List<Items> items = jsonArrayToObjectList(
            "domain/ItemsArray.json",  Item.class);

    public static <T> List<T> jsonArrayToObjectList(String jsonFileName, Class<T> tClass) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        final File file = ResourceUtils.getFile("classpath:" + jsonFileName);
        CollectionType listType = mapper.getTypeFactory()
            .constructCollectionType(ArrayList.class, tClass);
        List<T> ts = mapper.readValue(file, listType);
        return ts;
    }

Benutzer-Avatar
Alexandros Kurtis

Verwenden Sie den folgenden einfachen Code, es ist keine andere Bibliothek als GSON erforderlich

String list = "your_json_string";
Gson gson = new Gson();                         
Type listType = new TypeToken<ArrayList<YourClassObject>>() {}.getType();
ArrayList<YourClassObject> users = new Gson().fromJson(list , listType);

  • “Keine Notwendigkeit, eine Bibliothek zu verwenden” … aber Sie verwenden ganz klar GSON (das oben bereits eine Antwort enthält)?!

    – Michael Berry

    14. April 2020 um 9:19 Uhr


1186370cookie-checkWie konvertiert man eine JSON-Zeichenfolge in eine Liste von Java-Objekten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy