2016-04-06 17 views
0

ich einen String habe von einem Dienst zurückgegeben, in diesem JSON-Format:Konvertieren ein JSON String in Java Object

String message = { 
    "Tickets": 
      [{ 
        "Type": "type1", 
        "Author": "author1", 
        "Rows": 
          [ 
           { 
            "Price": "100.0", 
            "Date": "24/06/2016", 
            "Amount": "10" 
           }, 
           { 
            "Type": "Comment", 
            "Value": "some comment goes here" 
           } 
          ], 
        "ID": "165" 
       }], 
    "Desk": "desk1", 
    "User": "user1" 
} 

Ich brauche es zu analysieren und in ein Java-Objekt zu konvertieren. Ich versuchte, einen dom wie diese zu erstellen:

public class TicketWrapper{ 
    private Ticket ticket; 
    private String desk; 
    private String user; 
} 

public class Ticket { 
    private String type; 
    private String author; 
    private List<Row> rows; 
    private String id; 
} 

public class Row1{ 
    private float price; 
    private Date date; 
    private int amount; 
} 

public class Row2{ 
    private String type; 
    private float value; 
} 

Dann versuche ich es mit Google Gson zu analysieren, auf diese Weise:

TicketWrapper ticket = gson.fromJson(message, TicketWrapper.class) 

aber wenn ich es System.out.println(gson.toJson(ticket)) drucken, druckt es: {“ Schreibtisch ": 0," Benutzer ": 0}

Ich weiß nicht, wie man diesen Json in ein Java-Objekt parsiert, und wie man ihm sagt, dass eine Reihe in" Reihen "vom Row1-Typ oder von Row2 sein kann Art.

+3

Fall ist wichtig. – Savior

+2

Im JSON heißt das Attribut "Tickets" mit einem "s", und wie der Name schon sagt, ist es ein Array von Tickets und nicht nur ein einzelnes Ticket. Es ist auch unklar, was Row ist und wie Row1 und Row2 sind relevant. –

+0

Ich schlage vor, Sie lesen einige Tutorials in Bezug auf die Verwendung von Gson.fromJson – Pooya

Antwort

1

Ich denke, es gibt ein paar Probleme, solche Namen von Eigenschaften in Klein- und Datumsformat und mischen Arten von Zeilen. Ich änderte gerade so und arbeitete für mich:

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.annotations.SerializedName; 
import org.junit.Test; 
import java.util.Date; 
import java.util.List; 

public class CheckTest { 

    @Test 
    public void thisTest() { 
     Gson gson = new GsonBuilder() 
       .setDateFormat("dd-MM-yyyy") 
       .setPrettyPrinting() 
       .create(); 
     String message = "{\"Tickets\":" + 
       "[{\"Type\":\"type1\"," + 
       "\"Author\":\"author1\"," + 
       "\"Rows\":[{\"Price\":\"100.0\"," + 
       "\"Date\":\"24-06-2016\"," + 
       "\"Amount\":\"10\"}," + 
       "{\"Type\":\"Comment\"," + 
       "\"Value\":\"some comment goes here\"}]," + 
       "\"ID\":\"165\"}]," + 
       "\"Desk\":\"desk1\"," + 
       "\"User\":\"user1\"}"; 
     TicketWrapper ticket = gson.fromJson(message, TicketWrapper.class); 
     System.out.println(ticket.toString()); 
    } 

    public class TicketWrapper { 
     @SerializedName("Tickets") 
     private List<Ticket> tickets; 
     @SerializedName("Desk") 
     private String desk; 
     @SerializedName("User") 
     private String user; 
     public TicketWrapper() { 
     } 
    } 

    public class Ticket { 
     @SerializedName("Type") 
     private String type; 
     @SerializedName("Author") 
     private String author; 
     @SerializedName("Rows") 
     private List<Row> rows; 
     @SerializedName("ID") 
     private String id; 

     public Ticket() { 
     } 
    } 

    public class Row { 
     @SerializedName("Type") 
     private String type; 
     @SerializedName("Value") 
     private String value; 
     @SerializedName("Price") 
     private float price; 
     @SerializedName("Date") 
     private Date date; 
     @SerializedName("Amount") 
     private int amount; 

     public Row() { 
     } 
    } 
} 
+0

Danke, das ist was ich gesucht habe! Nur eine Sache, es gibt eine Möglichkeit, gson zu sagen: Wenn Zeile vom Typ Row1 ist, füllen Sie Felder von Row2 nicht, andernfalls, wenn es Row2 ist, füllen Sie Felder von Row1 nicht. Ich habe versucht, indem Sie einige Polymorphie wie 'Row1 extends Row' und' Row2 extends Row' und verwenden: 'private List Zeilen' , aber es füllt die Zeilen nur mit den Feldern der Basisklasse. Vielen Dank! – luca89pe

1

Wie andere bereits im Kommentar erwähnt haben, müssen Sie sicherstellen, dass das Mapping direkt die Dateinamen wiedergibt. Es muss "Benutzer" und "Schreibtisch" statt "Benutzer" und "Schreibtisch" sein. Außerdem haben Sie eine Liste mit Tickets, die List-Tickets zugeordnet werden.

Verwandte Themen