2016-05-17 6 views
-2

Wie kann ich die JSON-String wie folgt konvertieren:Konvertieren LinkedHashMap <String, MyClass> Java Object

{ "summary": { 
    "totalMR":4.599000000000903E12, 
    "totalMA":1.9174920000386694E11, 
    "totalQA":5.1111111181E9, 
    "totalQR":1.000020666115264E11 
    }, 
    "result": [{},{}], 
    "success":"true", 
    "total":49 
} 

zu einem Java-Objekt. Ich habe viele ähnliche Beiträge gelesen und Konstruktoren implementiert, konnte aber nicht die richtige Erklärung finden, warum ich den JSON nicht de-serialisieren kann.

Mache ich etwas falsch?

Meine Klasse:

public class expResponse { 
private String success; 
private String total; 
private ArrayList<LinkedHashMap<String,Object>> result; 
private LinkedHashMap<String,SummaryResponse> summary; 
// Constructor: public expResponse(){} 
// Getter and Setter 
} 

public class SummaryResponse { 
private Float totalQR; 
private Float totalQA; 
private Float totalMR; 
private Float totalMA; 

public SummaryResponse(){} 
// Setter and Getter 
} 

Mein Code:

private expResponse processResult(String result) throws IOException{ 
ObjectMapper objectMapper = new ObjectMapper(); 
expResponse expResponseObj = 
objectMapper.readValue(result, expResponse.class); 
return expResponseObj; 
+0

Welche JSON-Bibliothek verwenden Sie? – Nayuki

+0

@Nayuki Jackson – Jammy

+0

Was meinst du mit "kann JSON nicht de-serialisieren"? Erhalten Sie eine Ausnahme? Fehlende Daten? Blitzt Ihr Computer blauen Rauch? – dimo414

Antwort

2

Der von Ihnen gepostete JSON würde nicht in eine Map von SummaryResponse-Objekten deserialisieren, sondern eher ein einzelnes SummaryResponse-Objekt. Um Ihre Bindung Arbeit zu machen, würden Sie haben json haben, dass etwas so aussah:

{ 
... 
    'summary': { 
    'summary1': {"totalMR":4.599000000000903E12,"totalMA":1.9174920000386694E11,"totalQA":5.1111111181E9,"totalQR":1.000020666115264E11} 
    'summary2': {"totalMR":4.599000000000903E12,"totalMA":1.9174920000386694E11,"totalQA":5.1111111181E9,"totalQR":1.000020666115264E11} 
    } 
... 
} 

Alternativ, wenn Sie Ihre Java-Klasse entsprechen machen müssen, um die json Sie zur Verfügung gestellt, Sie einfach ändern müssen, um die Erklärung von Zusammenfassung:

private SummaryResponse summary; 
+0

Danke, es hat funktioniert! – Jammy

0

Ist es die SummaryResponse, die nicht deserialised werden kann?

Ich denke, Ihre Attribute sollten den gleichen Namen haben "totalMR", "totalMA" .... oder Sie sollten eine Anmerkung JsonProperty (value = "totalMR") und so weiter.

+0

Diese Antwort ist nicht korrekt. Seine Feldnamen stimmen mit den Namen der Felder in dem von ihm bereitgestellten json-Dokument überein. – rmlan

+0

in dem Dokument, das er vor zwei Minuten bearbeitet hat :) –

+0

Editiert für die Formatierung. Der Inhalt hat sich nicht geändert. – rmlan

1

Feld Zusammenfassung in Ihrem json ist ein Objekt vom Typ SummaryResponse und kein LinkedHashMap.

public class ExpResponse { 
    private String success; 
    private String total; 
    private ArrayList<LinkedHashMap<String,Object>> result; 
    private Summary summary; 
} 
1

Ich glaube nicht, dass Sie ein Problem im Code haben. Ihre Eingabe schlägt fehl, weil sie nicht im richtigen Format vorliegt. Wenn Sie versuchen, die gleichen Werte von einem Objekt mit den gleichen Werten zu bespannen schreiben bekommen Sie so etwas wie:

{ 
    "success":"true", 
    "total":"49", 
    "result":null, 
    "summary":{ 
     "one_summary":{ 
     "totalQR":2000.0, 
     "totalQA":1500.0, 
     "totalMR":1000.0, 
     "totalMA":500.0 
     } 
    } 
} 

Und der große Unterschied ist, die eine Zusammenfassung. Dies liegt daran, summary ist ein map und maps brauchen eine key für jede entryset. Das bedeutet, dass summary Ihre Karte ist, die einen one_summary-Schlüssel hat.

Verwandte Themen