2010-11-05 4 views
216

Nie mogę tego zrozumieć. Próbuję manipulować drzewem JSON w GSON, ale mam przypadek, w którym nie wiem lub mam POJO do konwersji ciągu znaków, przed konwersją do JsonObject. Czy istnieje sposób, aby przejść bezpośrednio z String do JsonObject?Gson: Bezpośrednio przekonwertuj String na JsonObject (no POJO)

Próbowałem następującą składnię (Scala):

val gson = (new GsonBuilder).create 

val a: JsonObject = gson.toJsonTree("""{ "a": "A", "b": true }""").getAsJsonObject 
val b: JsonObject = gson.fromJson("""{ "a": "A", "b": true }""", classOf[JsonObject]) 

ale a zawiedzie, JSON jest analizowany i uciekł jak tylko JsonString i b zwraca pusty JsonObject.

Wszelkie pomysły?

+0

Strzeż gson pułapek walidacji: https://stackoverflow.com/questions/43233898/how-to-check-if-json-is-valid-in-java-using-gson/47890960#47890960 – Vadzim

Odpowiedz

406

używać JsonParser; na przykład:

JsonParser parser = new JsonParser(); 
JsonObject o = parser.parse("{\"a\": \"A\"}").getAsJsonObject(); 
+12

ugh powinien mieć wygodną metodę 1 liniowca – Blundell

+0

bez statycznego przykładu, ale wiele przykładów linera poniżej – Yaniv

+37

rzutowanie na JsonObject jest niepotrzebne, lepiej użyj 'new JsonParser() .parse (..). getAsJsonObject();' – Chriss

9

Wystąpił po prostu ten sam problem. Można napisać trywialny niestandardowych Deserializator dla klasy JsonElement:

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonObject; 

GsonBuilder gson_builder = new GsonBuilder(); 
gson_builder.registerTypeAdapter(
     JsonElement.class, 
     new JsonDeserializer<JsonElement>() { 
      @Override 
      public JsonElement deserialize(JsonElement arg0, 
        Type arg1, 
        JsonDeserializationContext arg2) 
        throws JsonParseException { 

       return arg0; 
      } 
     }); 
String str = "{ \"a\": \"A\", \"b\": true }"; 
Gson gson = gson_builder.create(); 
JsonElement element = gson.fromJson(str, JsonElement.class); 
JsonObject object = element.getAsJsonObject(); 
+0

skonwertować Dane listy do obiektu json przez gson http://stackoverflow.com/questions/18442452/create-an-array-of -json-objects/18443395 # 18443395 popraw poprawną odpowiedź –

130

spróbować użyć getAsJsonObject() zamiast prostego obsady używany w przyjętym odpowiedź:

JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject(); 
+2

Z jakiegoś powodu jest opakowywany kluczem rodzica 'member'. Oto próbka { \t \t "członkowie": { \t \t \t "klucz1": "13756963814f2c594822982c0307fb81" \t \t \t "klucz2": true, \t \t \t "Key3": 123456789 \t \t} \t} –

+1

Użyj najnowszej biblioteki Gson, na przykład 2.2.4. Wersja podobna do 2.2.2 dodaje znacznik członków z jakiegoś powodu. –

36
String jsonStr = "{\"a\": \"A\"}"; 

Gson gson = new Gson(); 
JsonElement element = gson.fromJson (jsonStr, JsonElement.class); 
JsonObject jsonObj = element.getAsJsonObject(); 
+0

Czy mogę potwierdzić moją odpowiedź za pomocą GSON-a do konwersji danych listy do jsonobject przez gson http://stackoverflow.com/questions/18442452/create-an-array-of-json-objects/18443395#18443395 –

+3

Zatwierdziłem twoją odpowiedź . – Uttam

+0

Dlaczego bezpośrednie udzielanie 'JsonObject' nie działa? –

1

Natknąłem scenariuszu ze zdalnym sortowaniem magazynu danych w EXTJS 4.X, gdzie ciąg jest wysyłany do serwera jako tablica JSON (tylko 1 obiekt).
Podobne podejście do tego, co jest prezentowane wcześniej dla prostego łańcucha, wystarczy konwersja do JsonArray najpierw przed JsonObject.

ciągiem z klientem: [{ "Właściwość": "COLUMN_NAME", "kierunek" "ASC"}]

String jsonIn = "[{\"property\":\"COLUMN_NAME\",\"direction\":\"ASC\"}]"; 
JsonArray o = (JsonArray)new JsonParser().parse(jsonIn); 

String sortColumn = o.get(0).getAsJsonObject().get("property").getAsString()); 
String sortDirection = o.get(0).getAsJsonObject().get("direction").getAsString()); 
21

Najprostszym sposobem jest zastosowanie klasy JsonPrimitive, co wynika z JsonElement , jak pokazano poniżej:

JsonElement element = new JsonPrimitive(yourString); 
JsonObject result = element.getAsJsonObject(); 
+1

To najprostsza odpowiedź i pomogła mi. Dzięki! – khiner

+0

Poprosił o Jsonobject –

+0

Dzięki, mam zmodyfikowany przykład, aby dosłownie odpowiedzieć na pytanie. –

3

wierzę, że jest to bardziej proste podejście:

public class HibernateProxyTypeAdapter implements JsonSerializer<HibernateProxy>{ 

    public JsonElement serialize(HibernateProxy object_, 
     Type type_, 
     JsonSerializationContext context_) { 
     return new GsonBuilder().create().toJsonTree(initializeAndUnproxy(object_)).getAsJsonObject(); 
     // that will convert enum object to its ordinal value and convert it to json element 

    } 

    public static <T> T initializeAndUnproxy(T entity) { 
     if (entity == null) { 
      throw new 
       NullPointerException("Entity passed for initialization is null"); 
     } 

     Hibernate.initialize(entity); 
     if (entity instanceof HibernateProxy) { 
      entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer() 
        .getImplementation(); 
     } 
     return entity; 
    } 
} 

I wtedy będzie można to nazwać tak:

Gson gson = new GsonBuilder() 
     .registerTypeHierarchyAdapter(HibernateProxy.class, new HibernateProxyTypeAdapter()) 
     .create(); 

ten sposób wszystkie obiekty hibernacji będą zamieniane automatycznie.

1
//import com.google.gson.JsonObject; 
JsonObject complaint = new JsonObject(); 
complaint.addProperty("key", "value"); 
+0

Powyżej to najprostszy sposób konwertowania danych klucz-wartość na obiekt Gson. – Maddy

+0

Dzięki, w moim przypadku miałem niezaszyfrowany ciąg JSON, od którego musiałem zacząć. – 7zark7