Ошибка миграции кода Java с использованием com.jayway.jsonpath.JsonPath

Я использую код 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

JSONStyle — это класс Java. Вы должны создать его экземпляр, чтобы использовать его. Начните с чтения Преобразование примеров кода Java в CFML и Использование Java в Lucee, в которых объясняется, как создать экземпляр JSONStyle и других классов в этом фрагменте. Тогда попробуй это сделать. Если вы столкнетесь с проблемами, опубликуйте, что нового вы действительно пытались сделать, и любые сообщения об ошибках.
SOS 10.05.2022 05:08

существует проект с открытым исходным кодом под названием JMES Path, который предоставит решение, аналогичное тому, что вы ищете, и вот библиотека в чистом CFML github.com/scottsteinbeck/jmespath.

ssteinbeck 10.05.2022 09:48

кажется, что он использует coldbox, а я не использую coldbox, как я полагаю использовать проводной ящик

Rqs 10.05.2022 21:00

я загрузил файлы jar для jsonpoath в свой каталог java, загрузил его и попытался использовать, но я получаю это No matching Method for read(string, string) found for com.jayway.jsonpath.JsonPath, даже я сбросил экземпляр класса, чтобы проверить, правильно ли загружен jar, это так, но он не может прочитать метод ценность,

Rqs 10.05.2022 21:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

TL;ДР;

No matching method for read(string, string) found for com.jayway.jsonpath.JsonPath

Технически сообщение об ошибке правильное: нет метода read(), который принимает две строки (хотя именно так он используется в java-коде). Фактически метод ожидает аргументы три:

image of read method

Передайте пустой массив для третьего аргумента:

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, загруженный в мой код, но теперь проблема в том, что это использует новый стиль, что мне делать в этом случае

Rqs 11.05.2022 16:22
prnt.sc/VfhWqbEw6Y4n как выглядит мой стиль JSON
Rqs 11.05.2022 16:28
Ответ принят как подходящий

(Поскольку это превратилось в два вопроса в одной теме, я отделяю второй ответ для ясности...)

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

Что касается перевода кода JSONStyle, он помогает распаковать вложенный код изнутри. Затем беритесь за каждую часть отдельно:

  1. mediaArray.toJSONString (новый стиль JSON (JSONStyle.FLAG_IGNORE_NULL));

  2. mediaArray.toJSONString(новый JSONStyle( JSONStyle.FLAG_IGNORE_NULL ))

  3. 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);

Другие вопросы по теме