Я использую код 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));
Вот что я пытался до сих пор. Я загрузил библиотеку jar для пути JSON и попытался использовать ее следующим образом:
Настройки приложения.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(), я получаю эту ошибку:
No matching Method for read(string, string) found for com.jayway.jsonpath.JsonPath
существует проект с открытым исходным кодом под названием JMES Path, который предоставит решение, аналогичное тому, что вы ищете, и вот библиотека в чистом CFML github.com/scottsteinbeck/jmespath.
кажется, что он использует coldbox, а я не использую coldbox, как я полагаю использовать проводной ящик
я загрузил файлы jar для jsonpoath в свой каталог java, загрузил его и попытался использовать, но я получаю это No matching Method for read(string, string) found for com.jayway.jsonpath.JsonPath, даже я сбросил экземпляр класса, чтобы проверить, правильно ли загружен jar, это так, но он не может прочитать метод ценность,





TL;ДР;
No matching method for
read(string, string)found for com.jayway.jsonpath.JsonPath
Технически сообщение об ошибке правильное: нет метода read(), который принимает две строки (хотя именно так он используется в java-коде). Фактически метод ожидает аргументы три:
Передайте пустой массив для третьего аргумента:
JsonPath.read(jsonResponse, "$.entry_data.PostPage[:1].graphql.shortcode_media", []);
Объяснение:
String jsonResponse = instaDetailsElement.split(" = ")[1]; JsonPath.read(jsonResponse, "$.entry_data.PostPage[:1].graphql.shortcode_media")
Если на самом деле нет метода read(String, String), вы можете удивиться, почему код Java вообще работает, ведь он именно его и использует. Работает благодаря особенности java.
документация показывает, что перегруженный метод read(..) на самом деле имеет параметры три, но один из них особенный:
read(String json,
String jsonPath,
Predicate... filters)
Обратите внимание на ... после имени класса (Predicate)? Это конструкция с именем "варарги" (или переменное количество аргументов):
You can use a construct called varargs to pass an arbitrary number of values to a method. You use varargs when you don't know how many of a particular type of argument will be passed to the method. It's a shortcut to creating an array manually ...
To use varargs, you follow the type of the last parameter by an ellipsis (three dots, ...), then a space, and the parameter name. The method can then be called with any number of that parameter, including none.
Таким образом, в java вам разрешено полностью опускать третий аргумент и вызывать read(String, String) с двумя строками. ColdFusion не поддерживает такой синтаксис, поскольку он создает слишком много двусмысленности. Таким образом, вместо того, чтобы опускать аргумент, вы можете вместо этого передать пустой массив:
JsonPath.read(jsonResponse, "$.entry_data.PostPage[:1].graphql.shortcode_media", []);
о, хорошо, я получил arrayhasmap, используя технику, которую вы мне сказали, теперь, если вы можете помочь, есть еще одна часть, которая var returnJsonString = mediaArray.toJSONString(new JSONStyle(JSONStyle.FLAG_IGNORE_NULL));, теперь у меня есть файл json-smart.jar, загруженный в мой код, но теперь проблема в том, что это использует новый стиль, что мне делать в этом случае
(Поскольку это превратилось в два вопроса в одной теме, я отделяю второй ответ для ясности...)
var returnJsonString = mediaArray.toJSONString(new JSONStyle(JSONStyle.FLAG_IGNORE_NULL));
Что касается перевода кода JSONStyle, он помогает распаковать вложенный код изнутри. Затем беритесь за каждую часть отдельно:
mediaArray.toJSONString (новый стиль JSON (JSONStyle.FLAG_IGNORE_NULL));
mediaArray.toJSONString(новый JSONStyle( JSONStyle.FLAG_IGNORE_NULL ))
mediaArray.toJSONString( новый стиль JSON( JSONStyle.FLAG_IGNORE_NULL ) )
Кусок №1
Использует статический поле класса стиль JSON с именем FLAG_IGNORE_NULL. Чтобы получить доступ к полю, создайте ссылку на этот класс:
JsonStyle = createObject("java", "net.minidev.json.JSONStyle");
writeDump(JSONStyle.FLAG_IGNORE_NULL);
Кусок № 2
Создает новый экземпляр класса стиль JSON, используя статическое поле сверху. Используйте createObject() для создания нового экземпляра, передав статическое поле в псевдоконструктор 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);
JSONStyle— это класс Java. Вы должны создать его экземпляр, чтобы использовать его. Начните с чтения Преобразование примеров кода Java в CFML и Использование Java в Lucee, в которых объясняется, как создать экземпляр JSONStyle и других классов в этом фрагменте. Тогда попробуй это сделать. Если вы столкнетесь с проблемами, опубликуйте, что нового вы действительно пытались сделать, и любые сообщения об ошибках.