Forum Discussion

DharaSP's avatar
DharaSP
New Contributor
5 years ago
Solved

Custom Snap- Get response in json format

I am developing a custom SNAP that makes HTTP request and gets JSON response in return. The response is array of objects. In order to right it to document , currently it only shows up if I convert the response to string in following manner:

Map<String, Object> data = new LinkedHashMap<>();
data.put(“Response”, response);
outputViews.write(documentUtility.newDocumentFor(document, data));

But I’d like to instead preview the response in standard json format in outputview. Any idea how this can be achieved ? Any help would be appreciated . Thank you!

  • Yes, you’ll want to use the Jackson library’s ObjectMapper class for that.

    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.core.type.TypeReference;
    ...
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    private static final TypeReference<Object> TYPE_REF = new TypeReference<Object>() {};
    ...
    Object parsedResponse = OBJECT_MAPPER.readValue(response, TYPE_REF);
    

    Note there are other versions of the readValue method that take a Reader or InputStream, which means you might be able to avoid reading the entire response as a String.

    Hope that helps.

21 Replies

    • DharaSP's avatar
      DharaSP
      New Contributor

      Yes- The response is of type string

      This is the structured response I get when using CORE REST GET SNAP.

      But with custom snap- I am unable to get the similar structure. What am I missing?

  • Yes, you’ll want to use the Jackson library’s ObjectMapper class for that.

    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.core.type.TypeReference;
    ...
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    private static final TypeReference<Object> TYPE_REF = new TypeReference<Object>() {};
    ...
    Object parsedResponse = OBJECT_MAPPER.readValue(response, TYPE_REF);
    

    Note there are other versions of the readValue method that take a Reader or InputStream, which means you might be able to avoid reading the entire response as a String.

    Hope that helps.

  • DharaSP's avatar
    DharaSP
    New Contributor

    I’ll try that.
    The final step would be to add parsedResponse to Map - something like this:

    Map<String, Object> data = new LinkedHashMap<>();
    data.put(“Response”, parsedResponse);
    outputViews.write(documentUtility.newDocumentFor(document, data)) - right ?

    • ptaylor's avatar
      ptaylor
      Employee

      You don’t need to add parsedResponse to a Map unless for some reason you need the output structured that way. You can just directly use parsedResponse as the output document’s data:

      outputViews.write(documentUtility.newDocumentFor(document, parsedResponse));

  • DharaSP's avatar
    DharaSP
    New Contributor

    After making few changes, I deployed my snap pack and suddenly do not see property UI for any of the snaps. I tried clicking on snaps multiple times but no luck. Can someone please help as to what must be going on there ?

    • ptaylor's avatar
      ptaylor
      Employee

      Can you please provide more details about what you are seeing?

      What sort of changes did you make?

      Did you make any updates to the version metadata?

      How did you deploy the new snap pack?

      • mbowen's avatar
        mbowen
        Employee

        @DharaSP the web console (right-click inspect …) may also shed some clues …