coldfusionlucee

Java code migration error using com.jayway.jsonpath.JsonPath


I am using Java code and converting the code in ColdFusion. There are some challenges where I am stuck. This is one function I have in 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;
}

These two lines are giving me some trouble:

var mediaArray = JsonPath.read(jsonResponse, "$.entry_data.PostPage[:1].graphql.shortcode_media");
var returnJsonString = mediaArray.toJSONString(new JSONStyle(JSONStyle.FLAG_IGNORE_NULL));

Here is what I attempted so far. I loaded the jar library for JSON path and tried using it like this:

Application.cfc settings

<cfset this.javaSettings = {LoadPaths = ["cfc/jar"], loadColdFusionClassPath = true, reloadOnChange = false}>

CF Code:

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;
    }

I'm able to view the class methods when I dump the JsonPath object (screen shot), but when I try to call JsonPath.read() I get this error:

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


Solution

  • (Since this has turned into two questions in one thread, I'm separating the second answer out for clarity ...)

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

    As for translating the JSONStyle code, it helps to unpack nested code from the inside out. Then tackle each piece separately:

    1. mediaArray.toJSONString(new JSONStyle( JSONStyle.FLAG_IGNORE_NULL ));

    2. mediaArray.toJSONString( new JSONStyle( JSONStyle.FLAG_IGNORE_NULL ) )

    3. mediaArray.toJSONString( new JSONStyle( JSONStyle.FLAG_IGNORE_NULL ) )

    Piece #1

    Uses a static field of the JSONStyle class named FLAG_IGNORE_NULL. To access the field, create a reference to that class:

    JsonStyle = createObject("java", "net.minidev.json.JSONStyle");  
    writeDump(JSONStyle.FLAG_IGNORE_NULL);
    

    Piece #2

    Creates a brand new instance of the JSONStyle class, using the static field from above. Use createObject() to create the new instance, passing the static field into the psuedo constructor init():

     newJsonStyle = createObject("java", "net.minidev.json.JSONStyle").init(JSONStyle.FLAG_IGNORE_NULL);
     writeDump( newJsonStyle );
    

    Piece #3

    All that's left is calling the JSONArray.toJSONString() method with the JSONStyle object you just created:

     result = mediaArray.toJSONString( newJsonStyle );
     writeDump(result);