2013-03-22 5 views
6

Ho una domanda riguardante un'applicazione web che sto creando dove ho un servizio REST che riceve una stringa json.Analizzare l'oggetto json in una stringa

stringa JSON è qualcosa di simile:

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

sto usando RESTEasy per analizzare la stringa JSON che utilizza Jackson sotto. Ho una classe annotata jaxb e voglio analizzare l'oggetto interamente in una variabile String. La ragione per cui voglio farlo è quella di essere in grado di analizzare successivamente il json utilizzando il parser corretto (dipende dall'applicazione che invia la richiesta, quindi è impossibile sapere in anticipo).

mio JAXB annotato classe assomiglia a questo:

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

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

//getter and setter 
... 
} 

Quando eseguo la chiamata di riposo e lasciare Jackson analizzare questo codice ottengo un errore

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

. Quindi in realtà sto cercando di analizzare un pezzo di una stringa json, che è un oggetto json, in una stringa. Non riesco a trovare qualcuno con un problema simile.

Grazie in anticipo per qualsiasi risposta.

+4

Deve essere una stringa? Dato che stai usando Jackson, ti consiglio di memorizzare il tuo oggetto come [JsonNode] (http://fasterxml.github.com/jackson-databind/javadoc/2.1.0/com/fasterxml/jackson/databind/JsonNode.html). Questo dovrebbe essere deserializzato bene e sarai in grado di analizzarlo in seguito con il parser corretto. – nutlike

+0

Secondo il mio analista dovrebbe essere :). Lo proverò comunque, se funziona, lo convincerò. – KwintenP

risposta

0
java.lang.String out of START_OBJECT token 

questo significa che il carattere previsto dopo "object" è citazioni ", ma non staffe {.

JSON atteso

"object" : "my object" 

JSON Actual

"object" : { ... 

=======
Se si desidera analizzare JSON come nel tuo esempio, quindi modificare il vostro classe. Per esempio.

@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

Se ho ben capito questa domanda si desidera solo un mechnanism, che converte un Java-oggetto in un JSON-String e viceversa.

Avevo bisogno anche di questo, mentre stavo usando una comunicazione client-server WebSocket dove è stata passata una stringa JSON.

Per questo ho utilizzato GSON (vedere GSON). Lì hai la possibilità di creare una stringa JSON completa. Ecco alcuni esempi:

// 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); 
} 

Quello che vi serve è, che voi la classe-attributi-setter e JSON-Attribute-nomi sono equivalenti. Per esempio.

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

tua classe dovrebbe essere simile a questo:

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

si può anche fare qualcosa di simile;

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 Provare a usare la json smart library.

Si può poi semplicemente recuperare l'oggetto JSON primo utilizzo:

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

Cosa c'è di più, è possibile recuperare un oggetto specifico all'interno di un oggetto JSON può essere un altro oggetto, un array e convertirlo in una stringa o manipola nel modo desiderato.