Ответ 1
использовать JsonParser; например:
JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{\"a\": \"A\"}").getAsJsonObject();
Не похоже, чтобы понять это.
Я пытаюсь манипулировать деревьями JSON в GSON, но у меня есть случай, когда я не знаю или у меня есть POJO, чтобы преобразовать строку, прежде чем перейти к JsonObject
. Есть ли способ перейти непосредственно от 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
.
Любые идеи?
использовать JsonParser; например:
JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{\"a\": \"A\"}").getAsJsonObject();
Попробуйте использовать getAsJsonObject()
вместо прямого броска, используемого в принятом ответе:
JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject();
String jsonStr = "{\"a\": \"A\"}";
Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();
Самый простой способ - использовать класс JsonPrimitive
, который происходит от JsonElement
, как показано ниже:
JsonElement element = new JsonPrimitive(yourString);
JsonObject result = element.getAsJsonObject();
Только что столкнулась с той же проблемой. Вы можете написать тривиальный пользовательский десериализатор для класса 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();
Я считаю, что это более простой подход:
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();
Таким образом, все объекты спящего режима будут автоматически преобразованы.
Пришел сценарий с удаленной сортировкой хранилища данных в 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());
//import com.google.gson.JsonObject;
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");