Nextrp [CPP] RU + Many GEOs Игра на карте России | NEXTRP

Gson: Непосредственно конвертировать String в JsonObject (без POJO)

java json gson

261189 просмотра

8 ответа

6105 Репутация автора

Кажется, это не так. Я пытаюсь манипулировать деревьями JSON в GSON, но у меня есть случай, когда я не знаю или у меня есть POJO, чтобы преобразовать строку, прежде чем конвертировать в JsonObject. Есть ли способ перейти непосредственно от a Stringк JsonObject?

Я пробовал следующий (синтаксис 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])

но aне удается, JSON экранируется и анализируется как JsonStringединственный, и bвозвращает пустой JsonObject.

Есть идеи?

Автор: 7zark7 Источник Размещён: 05.11.2010 10:35

Ответы (8)


472 плюса

5031 Репутация автора

Решение

использовать JsonParser; например:

JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{\"a\": \"A\"}").getAsJsonObject();
Автор: Dallan Quass Размещён: 24.12.2010 03:27

10 плюса

4443 Репутация автора

Просто столкнулся с той же проблемой. Вы можете написать тривиальный пользовательский десериализатор для 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();
Автор: Dan Menes Размещён: 19.01.2011 01:10

136 плюса

1927 Репутация автора

Попробуйте использовать getAsJsonObject()вместо прямого броска, используемого в принятом ответе:

JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject();
Автор: maverick Размещён: 02.06.2011 06:35

42 плюса

2581 Репутация автора

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

Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();
Автор: Uttam Размещён: 20.06.2013 05:53

1 плюс

56 Репутация автора

Вышел сценарий с удаленной сортировкой хранилища данных в EXTJS 4.X, где строка отправляется на сервер в виде массива JSON (всего 1 объект).
Подобный подход к тому, что было представлено ранее для простой строки, просто нужно преобразовать в JsonArray сперва перед JsonObject.

Строка от клиента: [{"свойство": "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 Размещён: 27.12.2013 03:45

28 плюса

851 Репутация автора

Самый простой способ - использовать JsonPrimitiveкласс, который происходит JsonElement, как показано ниже:

JsonElement element = new JsonPrimitive(yourString);
JsonObject result = element.getAsJsonObject();
Автор: Jozef Benikovský Размещён: 28.02.2014 12:02

3 плюса

31 Репутация автора

Я считаю, что это более простой подход:

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

И тогда вы сможете назвать это так:

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

Таким образом, все объекты спящего режима будут преобразованы автоматически.

Автор: Eduardo Chico Размещён: 17.08.2014 07:58

1 плюс

123 Репутация автора

//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");
Автор: Maddy Размещён: 04.07.2015 04:41
Вопросы из категории :
32x32