gpt4 book ai didi

java - 动态 JSON 结构到 Java 结构

转载 作者:行者123 更新时间:2023-11-30 08:31:56 25 4
gpt4 key购买 nike

我正在开发一个项目,使用 JSON 作为创建 Java 对象的配置框架。这也是我在 CF/PHP/JS 等方面多年经验的第一个专业 Java 项目...

我能找到的关于将 JSON 转换为 Java 的所有资源都基于这样的想法,即您必须首先在 Java 中手动构建对象,一个 POJO,然后使用 JSON 来填充它。

作为一名网络语言老手,我对这个想法感到窒息。我知道编译语言的作用不同,但我认为这是从命令行到机器语言的开发人员共享的一个原则:“如果你必须做两次以上,就自动化它。”

...然而,Java 的主要智慧似乎是:每次都手动构建繁琐的结构,然后使用 GSON/Jackson/任何东西来填充刚性结构。如果您的 JSON 发生变化(它会发生变化,因为 JSON),请重新执行整个操作。

是否有平行于web代码的思维方式?
1) 加载JSON
2) 基于JSON结构构建本地语言结构。
3) 用结构中的数据填充新对象。
4) 根据需要使用对象。

(正如@Thomas 所指出的,最准确的情况是为什么需要这样做的最准确的情况是返回 JSON 的 API 响应,它可能会定期发生变化,而鸭子类型对于高级语言来说通常是不舒服的,甚至将所有内容都转换为与每次都重建您的框架{或拥有一个工具将您的 JSON 从无数来源转换为可供任何其他工具使用}相比,一个字符串可以节省精力和时间。同样,从牛仔语言的角度来看,这似乎是显而易见的,但对于人们不理解这个问题的高级语言。)

最佳答案

我仔细阅读了上面的评论,我认为有一个非常常见的场景,即使 API 结构在编译时已知,ad hoc Java 对象也会非常有用。

假设您处理一个 API,该 API 返回一个复杂的 JSON 对象,您只对其中一个非常具体的属性值感兴趣。

以下面的 google map API 调用为例,以获取给定地址的地理详细信息:

https://maps.googleapis.com/maps/api/geocode/json?address=sunnyvale,CA

如您所见,响应结构非常复杂。假设您只想获取 latlng 属性值,应该有更简单的方法而不是预定义完整的相应 Java 类。

所以是的,如果您不想使用强类型的预定义 Java 类,您将需要使用原始对象类型和映射。更具体地说,是一个 StringMap。

现在终于可以给出解决方案了:

理想情况下,您希望使用与在 JS 中相同的 native 符号来访问属性。像这样:

String url = "https://maps.googleapis.com/maps/api/geocode/json?address=" + address;
String responseStr = fetch(url);
JsonHelper response = JsonHelper.forString(responseStr);

String status = (String) response.getValue("status");
if(status != null && status.equals("OK")) {
lat = (Double) response.getValue("results[0].geometry.location.lat");
lng = (Double) response.getValue("results[0].geometry.location.lng");
}

以下JsonHelper 类代码取自jello-framework它可以让您做到这一点。

package jello.common;

import java.util.List;

import com.google.gson.Gson;
import java.util.AbstractMap;

public class JsonHelper {

private Object json;

public JsonHelper(String jsonString) {
Gson g = new Gson();
json = g.fromJson(jsonString, Object.class);
}

public static JsonHelper forString(String jsonString) {
return new JsonHelper(jsonString);
}

@SuppressWarnings("unchecked")
public Object getValue(String path) {
Object value = json;
String [] elements = path.split("\\.");
for(String element : elements) {
String ename = element.split("\\[")[0];

if(AbstractMap.class.isAssignableFrom(value.getClass())) {
value = ( (AbstractMap<String, Object>) value).get(ename);

if(element.contains("[")) {
if(List.class.isAssignableFrom(value.getClass())) {
Integer index = Integer.valueOf(element.substring(element.indexOf("[")+1, element.indexOf("]")) );
value = ((List<Object>) value).get(index);
}
else {
return null;
}
}
}
else {
return null;
}
}

return value;
}
}

关于java - 动态 JSON 结构到 Java 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com