Sonntag, Juli 5, 2020

Jackson-JSON-Bibliothek-Mapper String

Habe ich eine Klasse (A und B sind meine Objekte)

public A   {
    private List<B> b;
    private int c;
}

Habe ich eine String-variable temp. Also ich würde sparen Sie in diese variable den JSON-String von meinem Objekt. Wie?

Habe ich versucht, mit dieser Methode 2, aber ohne Ergebnis.

public void save() {
    ObjectMapper mapper = new ObjectMapper();
    String temp = mapper.writeValueAsString(a);
}
public void read(String temp) {
    ObjectMapper mapper = new ObjectMapper();
    A a = mapper.readValue(temp, A.class);
}

Wie kann ich es lösen?

  • „Ohne Ergebnis“, was bedeutet… ? Ich vermute, dass alles, was Sie brauchen, ist zum hinzufügen @JsonProperty Anmerkungen neben privaten Felder (Jackson folgt Bean-Konvention, und die privaten Felder werden ignoriert, nur die öffentlichen Felder serialisiert standardmäßig).
InformationsquelleAutor user2520969 | 2013-06-26

1 Kommentar

  1. 12

    Sollte der code übergeben Sie eine Instanz von Typ A zu den writeValueAsString Methode nicht die tatsächliche Klasse.

    Den ObjectMapper wird in der Lage sein, um zu bestimmen, die Instanz mit dem Typ per reflection, aber wenn Sie don ‚ T-pass-eine Instanz, die es kann nicht bestimmen den Wert des Feldes ist in den generierten JSON.

    Auch sicher sein, zu fangen oder zu werfen, die entsprechenden Ausnahmen.

    public void save() {
    
    try {
            A a = new A();
            ObjectMapper mapper = new ObjectMapper();
            String temp = mapper.writeValueAsString(a);
    
        } catch (JsonGenerationException e) {
           e.printStackTrace();
        } catch (JsonMappingException e) {
           e.printStackTrace();
        } catch (IOException e) {
           e.printStackTrace();
        }
    
    }

    Sollten Sie auch acessors für die Felder in der Klasse A und Klasse B. BEMERKEN ich B im vorherigen Satz, da Jackson muss in der Lage sein, um anzeigen alle Felder, die auf die Instanz, die wir es.

    public A   {
        private List<B> b;
        private int c;
    
        private B getB(){ return b;}
        private void setB(B b){this.b = b;}
        private int getC(){return c;}
        private void setC(int c){this.c = c;}
    }

    Hier ein komplettes lauffähiges Beispiel, das ich getestet habe.

    import java.io.IOException;
    import java.util.List;
    
    import org.codehaus.jackson.JsonGenerationException;
    import org.codehaus.jackson.map.JsonMappingException;
    import org.codehaus.jackson.map.ObjectMapper;
    
    public class A {
    
        private List<B> b;
        private int c;
    
        public List<B> getB() {
            return b;
        }
    
        public void setB(List<B> b) {
            this.b = b;
        }
    
        public int getC() {
            return c;
        }
    
        public void setC(int c) {
            this.c = c;
        }
    
        public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
            A a = new A();
            ObjectMapper mapper = new ObjectMapper();
            String temp = mapper.writeValueAsString(a);
            System.out.println(temp);   
        }
    }
    
    class B{
    
    
    }

    Wenn dieses einfache Beispiel funktioniert nicht, die jackson-mapper-asl.jar – Datei ist wahrscheinlich nicht auf dem build-Pfad. Laden Sie die Datei von hier und legen Sie Sie irgendwo auf Ihrer lokalen Maschine.

    Weiter über Eclipse mit der Rechten Maustaste auf Ihr Projekt und wählen Sie Eigenschaften.

    Wählen Sie dann Build Path > Bibliotheken > Add External Jars. Suchen Sie die Glas und drücken Sie dann OK.

    • Habe die Beispiel helfen?
    • Wenn Sie kopiert meine komplette Beispiel und es nicht laufen, dann seine build path-Problem. Heißt, Sie haben nicht die entsprechende jar Datei in den classpath. Sind Sie mit Eclipse?
    • Auch, stellen Sie sicher, dass Sie get/set-Methoden für jedes Feld in der Klasse B
    • Siehe aktualisierte Antwort
    • Muss ich etwas ändern in meiner Klasse Ein und die Methode speichern gehen. Ich habe die Ersatz-Liste<B> b = new List<B>() mit einer Liste<B> = new ArrayList<B>(). Jetzt habe ich ein anderes problem.. ich habe die Funktionen speichern und Lesen in 2 Aktivitäten, die sparen, gehen immer, aber die read-Funktion das erste mal es gehen und das zweite mal nicht. Warum?? Die gleiche Funktion aufgerufen, in zwei Aktivitäten..
    • Die Methode Lesen funktioniert nur, wenn die Liste<B> = b ist leer..

Kostenlose Online-Tests