Gson: Converter diretamente String em JsonObject (sem POJO)

300

Não consigo entender isso. Estou tentando manipulação de árvore JSON no GSON, mas tenho um caso em que não conheço ou tenho um POJO para converter uma string antes de converter para JsonObject. Existe uma maneira de ir diretamente de um Stringpara JsonObject?

Eu tentei o seguinte (sintaxe 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])

mas afalhar, o JSON é escapado e analisado como JsonStringúnico e bretorna um vazio JsonObject.

Alguma ideia?

7zark7
fonte
1
Cuidado com as armadilhas de validação do gson: stackoverflow.com/questions/43233898/…
Vadzim

Respostas:

525

use JsonParser; por exemplo:

JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{\"a\": \"A\"}").getAsJsonObject();
Dallan Quass
fonte
17
ugh deve ter um estático 1 liner método de conveniência
Blundell
43
o elenco para JSONObject é desnecessário, melhor aproveitamentonew JsonParser().parse(..).getAsJsonObject();
Chriss
1
Eu acho que JsonParser é uma classe abstrata
Jatin Sehgal
1
@KevinMeredith você link está quebrado, usar esse favor
Ninja
4
Observe que esse método agora está obsoleto. Use JsonParser.parseString(str).getAsJsonObject().
Michael Röhrig
147

Tente usar em getAsJsonObject()vez de um elenco reto usado na resposta aceita:

JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject();
independente
fonte
2
Por algum motivo, envolve membersa chave dos pais. Aqui está uma amostra { "membros": { "key1": "13756963814f2c594822982c0307fb81", "key2": true "key3": 123456789}}
Hossain Khan
1
Use a biblioteca gson mais recente, como 2.2.4. A versão como 2.2.2 adiciona tag de membros por algum motivo.
Rubin Yoo
2
JsonParser (). Parse () está obsoleto nas versões mais recentes do Gson. Use JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()or Gson gson = new Gson(); JsonElement element = gson.fromJson (jsonStr, JsonElement.class); JsonObject jsonObj = element.getAsJsonObject();
Jimmy Garpehäll
54
String jsonStr = "{\"a\": \"A\"}";

Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();
Purushotham
fonte
você pode validar minha resposta com a maneira GSON para converter dados da lista em jsonobject por gson stackoverflow.com/questions/18442452/…
LOG_TAG
3
Eu validei sua resposta.
Purushotham
@knoxxs, você quer dizer JsonObjectdefinição de classe? Vem da biblioteca Gson do Google. Você pode consultar a documentação aqui .
Purushotham
Isso me dá um erro reclamando sobre o JsonElement não ter um construtor no-arg.
clapas
37

A maneira mais simples é usar a JsonPrimitiveclasse, que deriva de JsonElement, como mostrado abaixo:

JsonElement element = new JsonPrimitive(yourString);
JsonObject result = element.getAsJsonObject();
Jozef Benikovský
fonte
2
Esta é a resposta mais simples e me ajudou. Obrigado!
khiner
11

Acabei de encontrar o mesmo problema. Você pode escrever um desserializador personalizado trivial para a JsonElementclasse:

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();
Dan Menes
fonte
4

Acredito que esta é uma abordagem mais fácil:

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

E então você poderá chamá-lo assim:

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

Dessa forma, todos os objetos de hibernação serão convertidos automaticamente.

Eduardo Chico
fonte
3

O JsonParserconstrutor foi preterido. Use o método estático:

JsonObject asJsonObject = JsonParser.parseString(request.schema).getAsJsonObject();
Stephen Paul
fonte
2

Me deparei com um cenário com classificação remota de armazenamento de dados no EXTJS 4.X, em que a cadeia é enviada ao servidor como uma matriz JSON (de apenas 1 objeto).
Abordagem semelhante ao que é apresentado anteriormente para uma sequência simples, só precisa da conversão para o JsonArray antes do JsonObject.

String do cliente: [{"property": "COLUMN_NAME", "direction": "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());
c2willi
fonte
1
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");
Maddy
fonte
Acima está a maneira mais fácil de converter seus dados de valor-chave em objeto gson.
Maddy
1
Obrigado, no meu caso, eu tinha uma string JSON não analisada da qual precisava começar.
7zark7