我正在使用Java代码并在ColdFusion中转换代码。有些挑战我被困住了。这是我在Java中拥有的一个函数:
import com.jayway.jsonpath.JsonPath;
import net.minidev.json.JSONArray;
import net.minidev.json.JSONStyle;
private static String getDetails(String instaDetailsElement) {
String jsonResponse = instaDetailsElement.split(" = ")[1];
JSONArray mediaArray = JsonPath.read(jsonResponse, "$.entry_data.PostPage[:1].graphql.shortcode_media");
String returnJsonString = mediaArray.toJSONString(new JSONStyle(JSONStyle.FLAG_IGNORE_NULL));
System.out.println(returnJsonString);
return returnJsonString;
}这两句话给了我一些麻烦:
var mediaArray = JsonPath.read(jsonResponse, "$.entry_data.PostPage[:1].graphql.shortcode_media");
var returnJsonString = mediaArray.toJSONString(new JSONStyle(JSONStyle.FLAG_IGNORE_NULL));以下是我迄今所做的尝试。我为JSON路径加载了jar库,并尝试像这样使用它:
Application.cfc设置
<cfset this.javaSettings = {LoadPaths = ["cfc/jar"], loadColdFusionClassPath = true, reloadOnChange = false}>CF代码:
public any function getDetails(String instaDetailsElement) {
var jsonResponse = instaDetailsElement.split(" = ")[1];
var JsonPath = Createobject("java","com.jayway.jsonpath.JsonPath");
writedump(application);
var mediaArray = JsonPath.read(jsonResponse, "$.entry_data.PostPage[:1].graphql.shortcode_media");
writedump(mediaArray); abort;
var returnJsonString = mediaArray.toJSONString(new JSONStyle(JSONStyle.FLAG_IGNORE_NULL));
return returnJsonString;
}当我转储JsonPath对象(屏幕截图)时,我能够查看类方法,但是当我试图调用JsonPath.read()时,我得到了以下错误:
没有为com.jayway.jsonpath.JsonPath找到读取(字符串,字符串)的匹配方法
发布于 2022-05-11 18:04:01
(由于这变成了一个线程中的两个问题,我将第二个答案分离出来,以求清晰.)
var returnJsonString = mediaArray.toJSONString(new JSONStyle(JSONStyle.FLAG_IGNORE_NULL));
至于翻译JSONStyle代码,它有助于从内到外解压嵌套代码。然后分别处理每一件:
件#1
使用JSONStyle类的名为FLAG_IGNORE_NULL的静态字段。要访问该字段,请创建对该类的引用:
JsonStyle = createObject("java", "net.minidev.json.JSONStyle");
writeDump(JSONStyle.FLAG_IGNORE_NULL);部件#2
使用上面的静态字段创建JSONStyle类的全新实例。使用createObject()创建新实例,将静态字段传递给psuedo构造函数init():
newJsonStyle = createObject("java", "net.minidev.json.JSONStyle").init(JSONStyle.FLAG_IGNORE_NULL);
writeDump( newJsonStyle );部件#3
剩下的就是用刚才创建的JSONArray.toJSONString()对象调用JSONStyle方法:
result = mediaArray.toJSONString( newJsonStyle );
writeDump(result);发布于 2022-05-11 03:07:22
TL;DR;
没有为
read(string, string)找到com.jayway.jsonpath.JsonPath的匹配方法
从技术上讲,错误消息是正确的:没有可接受两个字符串的read()方法(即使在java代码中是这样使用的)。该方法实际上需要三个参数:

为第三个参数传入一个空数组:
JsonPath.read(jsonResponse, "$.entry_data.PostPage[:1].graphql.shortcode_media", []);解释:
字符串jsonResponse = instaDetailsElement.split(“= ")1;JsonPath.read(jsonResponse,instaDetailsElement.split)
如果真的没有read(String, String)方法,您可能会想知道为什么java代码能够工作,因为这正是它所使用的。它的工作是由于java的一个特殊特性。
文档显示重载的read(..)方法实际上有三个参数,但其中一个参数是特殊的:
read(String json,
String jsonPath,
Predicate... filters)注意类名(谓词)后面的...吗?它是一个名为“瓦拉格” (或可变参数数)的构造:
您可以使用名为varargs的构造将任意数量的值传递给方法。当您不知道将有多少特定类型的参数传递给该方法时,可以使用varargs。这是手动创建数组的快捷方式. 要使用varargs,可以使用省略号(三个点,.)、空格和参数名来跟踪最后一个参数的类型。然后可以用任意数量的参数调用该方法,包括none__。
因此,在java中,您可以完全省略第三个参数,并使用两个字符串调用read(String, String)。ColdFusion不支持这种语法,因为它造成了太多的歧义。因此,与省略参数相反,可以传递一个空数组来代替:
JsonPath.read(jsonResponse, "$.entry_data.PostPage[:1].graphql.shortcode_media", []);https://stackoverflow.com/questions/72179543
复制相似问题