我正在使用com.google.格森。Gson将JSON字符串转换为Java对象的API:
Gson gson = new Gson();
User u = gson.fromJson(jsonString, User.class);
我想知道javax.jsonapi中是否有等效的API来执行等效操作。谢谢!
不,没有。
在您尝试其他解析器之前,请先访问GSON:org。json有缺陷/存在实现错误。QuickJson有缺陷/存在实现错误
对于像Gson这样的oneliner,这绝对是不可能的。javax。json的API级别非常低。它只返回一个JSON对象结构,您必须自己分解并进一步映射到javabean。
为了实现(几乎)与Gson#fromJson()相同的效果,这里有一个样板代码的启动示例。在一定程度上支持参数化类型和javabeans。这都是标准的Java SE API,javabeans是在Java的帮助下进行内省的。beanAPI。
@SuppressWarnings("unchecked")
public static <T> T fromJson(String json, Class<T> beanClass) {
JsonValue value = Json.createReader(new StringReader(json)).read();
return (T) decode(value, beanClass);
}
private static Object decode(JsonValue jsonValue, Type targetType) {
if (jsonValue.getValueType() == ValueType.NULL) {
return null;
}
else if (jsonValue.getValueType() == ValueType.TRUE || jsonValue.getValueType() == ValueType.FALSE) {
return decodeBoolean(jsonValue, targetType);
}
else if (jsonValue instanceof JsonNumber) {
return decodeNumber((JsonNumber) jsonValue, targetType);
}
else if (jsonValue instanceof JsonString) {
return decodeString((JsonString) jsonValue, targetType);
}
else if (jsonValue instanceof JsonArray) {
return decodeArray((JsonArray) jsonValue, targetType);
}
else if (jsonValue instanceof JsonObject) {
return decodeObject((JsonObject) jsonValue, targetType);
}
else {
throw new UnsupportedOperationException("Unsupported json value: " + jsonValue);
}
}
private static Object decodeBoolean(JsonValue jsonValue, Type targetType) {
if (targetType == boolean.class || targetType == Boolean.class) {
return Boolean.valueOf(jsonValue.toString());
}
else {
throw new UnsupportedOperationException("Unsupported boolean type: " + targetType);
}
}
private static Object decodeNumber(JsonNumber jsonNumber, Type targetType) {
if (targetType == int.class || targetType == Integer.class) {
return jsonNumber.intValue();
}
else if (targetType == long.class || targetType == Long.class) {
return jsonNumber.longValue();
}
else {
throw new UnsupportedOperationException("Unsupported number type: " + targetType);
}
}
private static Object decodeString(JsonString jsonString, Type targetType) {
if (targetType == String.class) {
return jsonString.getString();
}
else if (targetType == Date.class) {
try {
return new SimpleDateFormat("MMM dd, yyyy H:mm:ss a", Locale.ENGLISH).parse(jsonString.getString()); // This is default Gson format. Alter if necessary.
}
catch (ParseException e) {
throw new UnsupportedOperationException("Unsupported date format: " + jsonString.getString());
}
}
else {
throw new UnsupportedOperationException("Unsupported string type: " + targetType);
}
}
private static Object decodeArray(JsonArray jsonArray, Type targetType) {
Class<?> targetClass = (Class<?>) ((targetType instanceof ParameterizedType) ? ((ParameterizedType) targetType).getRawType() : targetType);
if (List.class.isAssignableFrom(targetClass)) {
Class<?> elementClass = (Class<?>) ((ParameterizedType) targetType).getActualTypeArguments()[0];
List<Object> list = new ArrayList<>();
for (JsonValue item : jsonArray) {
list.add(decode(item, elementClass));
}
return list;
}
else if (targetClass.isArray()) {
Class<?> elementClass = targetClass.getComponentType();
Object array = Array.newInstance(elementClass, jsonArray.size());
for (int i = 0; i < jsonArray.size(); i++) {
Array.set(array, i, decode(jsonArray.get(i), elementClass));
}
return array;
}
else {
throw new UnsupportedOperationException("Unsupported array type: " + targetClass);
}
}
private static Object decodeObject(JsonObject object, Type targetType) {
Class<?> targetClass = (Class<?>) ((targetType instanceof ParameterizedType) ? ((ParameterizedType) targetType).getRawType() : targetType);
if (Map.class.isAssignableFrom(targetClass)) {
Class<?> valueClass = (Class<?>) ((ParameterizedType) targetType).getActualTypeArguments()[1];
Map<String, Object> map = new LinkedHashMap<>();
for (Entry<String, JsonValue> entry : object.entrySet()) {
map.put(entry.getKey(), decode(entry.getValue(), valueClass));
}
return map;
}
else try {
Object bean = targetClass.newInstance();
for (PropertyDescriptor property : Introspector.getBeanInfo(targetClass).getPropertyDescriptors()) {
if (property.getWriteMethod() != null && object.containsKey(property.getName())) {
property.getWriteMethod().invoke(bean, decode(object.get(property.getName()), property.getWriteMethod().getGenericParameterTypes()[0]));
}
}
return bean;
}
catch (Exception e) {
throw new UnsupportedOperationException("Unsupported object type: " + targetClass, e);
}
}
用法:
User u = YourJsonUtil.fromJson(jsonString, User.class);
如果您看到来自某个方法的不支持操作异常(UnsupportedOperationException),只需将所需的转换逻辑添加到所讨论的方法中即可。当然,这可以进一步重构以应用策略模式等,从而使其具有灵活性和可扩展性,但我们基本上是在重新设计Gson。
我有Json String看起来像这样 并希望将此Json字符串转换为对象的数组列表,并将所有元素放在类(数据Object.class)上并打印元素。 输出为: 我创建的类具有这种形式 我做错了什么?
我正在开发一个Android应用程序。在我的应用程序中,我必须将字符串转换为JSON对象,然后解析值。我检查了Stackoverflow中的解决方案,并在这里的链接中发现了类似的问题 解决办法是这样的
错误中的SOAP WSDL URL是Spring Boot应用程序中的另一个web服务。试图理解为什么这会出现在错误中。 UnmarshalException:意外元素(URI:“”,local:“message”)。需要的元素是<{http://soap_wsdl_url}jaxb_pojo_name>
问题内容: 我正在开发一个Android应用程序。在我的应用程序中,我必须将字符串转换为Json Object,然后解析值。我检查了stackoverflow中的解决方案,并在此处找到了类似的问题链接 解决方案是这样的 我在代码中使用相同的方式。我的绳子是 替换后,我得到了这样的结果 当我执行 我收到以下json异常 请帮助我解决我的问题。 问题答案: 删除斜杠:
我正在尝试将json解析为java。 根据jsonlint,以下字符串是有效的json。com公司 我试图将它解析成一个对象,我得到了以下错误。"预期BEGIN_OBJECT但BEGIN_ARRAY在第1行第2列" BoxSearch由此组成。 框是定义相同的纬度对象和经度对象。 我可以将更高级别的属性(lat1、lat2、long1和long2)解析为一个更简单的BoxSearch对象,该对象只
我有以下JSON字符串: 我只想要和。我试过这样的方法: 但我得到了以下错误: 我只使用过几次JSON。有人能帮我吗? 对我来说最好的例子是这样的,我在另一个例子中做过: 可能吗? 现在我已经做到了: 我试着这样做: 然后: 但现在当我做一个Prtinout时,我会得到和以前一样的错误: