2013-03-22 13 views
6

Ich habe eine Frage zu einer Web-Anwendung, die ich baue, wo ich einen REST-Dienst eine JSON-Zeichenfolge erhalten.Parsing JSON Objekt in eine Zeichenfolge

Die JSON-String ist so etwas wie:

{ 
    "string" : "value", 
    "string" : "value", 
    "object" : { 
       "string" : "value", 
       "string" : "value", 
       .... 
       } 
} 

Ich bin mit dem Resteasy json Zeichenfolge zu analysieren, die Jackson unter verwendet. Ich habe eine jaxb annotierte Klasse und ich möchte das "Objekt" vollständig in eine String-Variable analysieren. Der Grund dafür ist, dass ich den JSON später mit dem richtigen Parser parsen kann (das hängt von der Anwendung ab, die die Anfrage sendet, so dass es unmöglich ist, dies im Voraus zu wissen).

Meine jaxb kommentierte Klasse sieht wie folgt aus:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Test{ 

@XmlElement(type = String.class) 
private String object; 

//getter and setter 
... 
} 

Wenn ich den Rest Anruf ausführen und lassen jackson diesen Code analysieren ich eine

Can not deserialize instance of java.lang.String out of START_OBJECT token 

Fehler. Also versuche ich tatsächlich ein Stück einer JSON-Zeichenfolge, die ein JSON-Objekt ist, in eine Zeichenfolge zu zerlegen. Ich kann anscheinend niemanden mit einem ähnlichen Problem finden.

Vielen Dank im Voraus für eine Antwort.

+4

Muss es ein String sein? Da Sie Jackson verwenden, würde ich empfehlen, Ihr Objekt als [JsonNode] zu speichern (http://fasterxml.github.com/jackson-databind/javadoc/2.1.0/com/fasterxml/jackson/databind/JsonNode.html). Dies sollte einfach deserialisiert werden und Sie können es anschließend mit dem richtigen Parser analysieren. – nutlike

+0

Laut meinem Analyst sollte es sein :). Ich werde es trotzdem versuchen, wenn es funktioniert, werde ich ihn überzeugen. – KwintenP

Antwort

0
java.lang.String out of START_OBJECT token 

bedeutet dies, dass Charakter erwartet, nachdem "object" Anführungszeichen ist ", aber nicht Klammern {.

Expected json

"object" : "my object" 

Actual json

"object" : { ... 

=======
Wenn Sie json wie in Ihrem Beispiel analysieren wollen, dann ändern Klasse. Z.B.

@XmlRootElement 
@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Test{ 

    @XmlElement 
    private InnerTest object; 

    //getter and setter 
... 
} 

@XmlAccessorType(XmlAccessType.PROPERTY) 
public class InnerTest{ 

    @XmlElement 
    private String string; 

    //getter and setter 
... 
} 
1

Wenn ich diese Frage verstehen Sie nur eine mechnanism wollen, die ein Java-Objekt in ein JSON-String konvertiert und umgekehrt.

Ich brauchte dies auch, während ich eine WebSocket Client-Server-Kommunikation verwendete, bei der ein JSON-String übergeben wurde.

Dazu habe ich GSON verwendet (siehe GSON). Dort haben Sie die Möglichkeit einen kompletten JSON-String zu erstellen. Hier einige Beispiele:

// Converts a object into a JSON-String 
public String convertMyClassObjectToJsonFormat() { 
    MyClass myObject = new MyClass(); 
    Gson gson = new Gson(); 

    return gson.toJson(myObject); 
} 

//Converts a JSON-String into a Java-Class-Object 
public MyClass convertJsonToMyClassObject(
      CharBuffer jsonMessage) { 
    Gson gson = new Gson(); 

    return gson.fromJson(jsonMessage.toString(), 
       MyClass.class); 
} 

Was Sie brauchen, ist, dass Sie Ihre Klasse-Attribute-Setter und JSON-Attribut-Namen gleichwertig sind. Z.B.

{ 
    "info":[ 
     { 
     "name": "Adam", 
     "address": "Park Street" 
     } 
    ] 
} 

Ihre Klasse sollte wie folgt aussehen:

public class Info{ 
private String name; 
private String address; 

public void setName(String name){ 
    this.name = name; 
} 
public void setAddress(String address){ 
    this.address = address; 
} 
} 
0

Sie auch so etwas tun kann;

public class LeaderboardView 
{ 
    @NotEmpty 
    @JsonProperty 
    private String appId; 

    @NotEmpty 
    @JsonProperty 
    private String userId; 

    @JsonProperty 
    private String name = ""; 

    @JsonProperty 
    private String imagePath = ""; 

    @NotEmpty 
    @JsonIgnore 
    private String rank = ""; 

    @NotEmpty 
    @JsonProperty 
    private String score; 

    public LeaderboardView() 
    { 
     // Jackson deserialization 
    } 

}

1

@KwintenP Versuchen Sie, die json smart library verwenden.

können Sie dann das JSON-Objekt einfach abrufen zuerst mit:

JSONObject test = (JSONObject) JSONValue.parse(yourJSONObject); 
String TestString = test.toString(); 

Was, Sie ein bestimmtes Objekt in einem JSON-Objekt ist mehr abrufen können, kann es ein anderes Objekt sein, ein Array und wandelt es in einen String oder manipuliere wie du willst.