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?


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();

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();

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();

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();

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();

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.


3

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

JsonObject asJsonObject = JsonParser.parseString(request.schema).getAsJsonObject();

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());

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.