首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用com.jayway.jsonpath.JsonPath迁移Java代码错误

使用com.jayway.jsonpath.JsonPath迁移Java代码错误
EN

Stack Overflow用户
提问于 2022-05-10 00:37:55
回答 2查看 150关注 0票数 1

我正在使用Java代码并在ColdFusion中转换代码。有些挑战我被困住了。这是我在Java中拥有的一个函数:

代码语言:javascript
复制
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;
}

这两句话给了我一些麻烦:

代码语言:javascript
复制
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设置

代码语言:javascript
复制
<cfset this.javaSettings = {LoadPaths = ["cfc/jar"], loadColdFusionClassPath = true, reloadOnChange = false}>

CF代码:

代码语言:javascript
复制
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找到读取(字符串,字符串)的匹配方法

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-11 18:04:01

(由于这变成了一个线程中的两个问题,我将第二个答案分离出来,以求清晰.)

var returnJsonString = mediaArray.toJSONString(new JSONStyle(JSONStyle.FLAG_IGNORE_NULL));

至于翻译JSONStyle代码,它有助于从内到外解压嵌套代码。然后分别处理每一件:

  1. JSONStyle.FLAG_IGNORE_NULL (mediaArray.toJSONString);
  2. mediaArray.toJSONString( new JSONStyle( JSONStyle.FLAG_IGNORE_NULL ) )
  3. mediaArray.toJSONString(新JSONStyle( JSONStyle.FLAG_IGNORE_NULL ) )

件#1

使用JSONStyle类的名为FLAG_IGNORE_NULL的静态字段。要访问该字段,请创建对该类的引用:

代码语言:javascript
复制
JsonStyle = createObject("java", "net.minidev.json.JSONStyle");  
writeDump(JSONStyle.FLAG_IGNORE_NULL);

部件#2

使用上面的静态字段创建JSONStyle类的全新实例。使用createObject()创建新实例,将静态字段传递给psuedo构造函数init():

代码语言:javascript
复制
 newJsonStyle = createObject("java", "net.minidev.json.JSONStyle").init(JSONStyle.FLAG_IGNORE_NULL);
 writeDump( newJsonStyle );

部件#3

剩下的就是用刚才创建的JSONArray.toJSONString()对象调用JSONStyle方法:

代码语言:javascript
复制
 result = mediaArray.toJSONString( newJsonStyle );
 writeDump(result);
票数 0
EN

Stack Overflow用户

发布于 2022-05-11 03:07:22

TL;DR;

没有为read(string, string)找到com.jayway.jsonpath.JsonPath的匹配方法

从技术上讲,错误消息是正确的:没有可接受两个字符串的read()方法(即使在java代码中是这样使用的)。该方法实际上需要三个参数:

为第三个参数传入一个空数组:

代码语言:javascript
复制
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(..)方法实际上有三个参数,但其中一个参数是特殊的:

代码语言:javascript
复制
read(String json,
     String jsonPath,
     Predicate... filters)

注意类名(谓词)后面的...吗?它是一个名为“瓦拉格” (或可变参数数)的构造:

您可以使用名为varargs的构造将任意数量的值传递给方法。当您不知道将有多少特定类型的参数传递给该方法时,可以使用varargs。这是手动创建数组的快捷方式. 要使用varargs,可以使用省略号(三个点,.)、空格和参数名来跟踪最后一个参数的类型。然后可以用任意数量的参数调用该方法,包括none__。

因此,在java中,您可以完全省略第三个参数,并使用两个字符串调用read(String, String)。ColdFusion不支持这种语法,因为它造成了太多的歧义。因此,与省略参数相反,可以传递一个空数组来代替:

代码语言:javascript
复制
JsonPath.read(jsonResponse, "$.entry_data.PostPage[:1].graphql.shortcode_media", []);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72179543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档