Как мне сделать, чтобы мой POST-запрос принял мою полезную нагрузку JSON в следующем формате? Я использую Джексона для этой операции - PullRequest
0 голосов
/ 23 октября 2019

Как заставить этот запрос POST принимать полезную нагрузку, где я передаю массив объектов JSON. Есть ли способ решить эту проблему. Любое предложение поможет?

package com.fyle.app.resources.lambda;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.schibsted.spt.data.jslt.Parser;
import com.schibsted.spt.data.jslt.Expression;
import com.schibsted.spt.data.jslt.impl.NodeUtils;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;



@Path("/api")
public class LambdaFunction {

/**
 * Transform the incoming JSON with JSLT and return the result.
 */
@POST
@Path("/json-post")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String invoke(InputJson json) {
    try {
        // this must be:
        // {"json" : ..., "jslt" : jslt}

        JsonNode input = mapper.convertValue(json.getJson(), JsonNode.class);

        // now we can do the thing
        JsonNode source = NodeUtils.mapper.readTree(input.get("json").asText());
        //String jslt = input.get("jstlTemplateString").asText();
        String jstlTemplateString = json.get("jstlTemplateString");

        Expression template = Parser.compileString(jstlTemplateString);
        JsonNode output = template.apply(source);
        return NodeUtils.mapper.writerWithDefaultPrettyPrinter().writeValueAsString(output);
    } catch (Throwable e) {
        return "ERROR: " + e;
    }
}

Полезная нагрузка JSON, которую он принимает ::

{
 "json":"[{\"Key1\": \"Value1\", \"Key2\": \"Value2\", \"Key3\": \"Value3\"},{\"Key1\":      
 \"Value1\", \"Key2\": \"Value2\", \"Key3\": \"Value3\"},{\"Key1\": \"Value1\", \"Key2\": 
 \"Value2\", \"Key3\": \"Value3\"}]”,

 "jstl":"\n[\nfor (.)\n{\n \"Key-Change-1\" : .Key1,\n \"Key-Change-2\": .\"Key2\",\n \"Key- 
 Change-3\" : .\"Key3\"\n}\n]\n”
}

Можем ли мы принимать данные только в формате JSON без этих "\ and \ n"

{"json": "["key":"value" , "key":"value" , "key":"value"]" , "jslt":"template.jslt"}

Мой класс полезной нагрузки ::

public class InputJson {
Object json;
String jstlTemplateString;

public Object getJson() {
    return json;
}

public void setJson(Object json) {
    this.json = json;
}

public String getJstlTemplateString() {
    return jstlTemplateString;
}

public void setJstlTemplateString(String jstlTemplateString) {
    this.jstlTemplateString = jstlTemplateString;
}

public String get(String jstlTemplateString) {
    return jstlTemplateString;
}
}

Это файл класса, который я использую, но все еще с той же ошибкой. Я думаю, что проблема с этой строкой

JsonNode source = NodeUtils.mapper.readTree(input.get("json").asText());

Ожидается, что вход будет строкой, а не объектами JSON. Является ли это основной причиной этой проблемы?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Ваш ключ "jstl" неверен. Его значение равно «[для (.) {». Затем ожидается «,» до того, как начнется Key-Change-1. Отсюда и данная ошибка. Вы можете использовать любой онлайн-редактор json, чтобы проверить, верен ли ваш json или нет. https://jsoneditoronline.org/. Если вся ваша строка является значением;Вы должны экранировать двойные кавычки, используя значение. как {

"jstl": "[for (.) {\" Key-Change-1 \ ": .Key1, \" Key-Change-2 \ ":. \" Key2 \ ", \"Key-Change-3 \":. \ "Key3 \"}] "}

Редактировать:

class Payload{
    MyJson json;
    Template template;
}

class MyJson{
    String k1;
    String k2;
    .....
}

class Template{
    String t1;
    ......
}

Определить конструкторы, методы получения и установки для этих классов, а затем вы можете передатьОбъект полезной нагрузки с вашим запросом POST.

0 голосов
/ 24 октября 2019

Ваш метод принимает JSON, а не текст. Вы должны создать класс и передать его. Поэтому, учитывая ответ Рахула Агравала, вам нужно изменить код на:

@POST
@Path("/json-post")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.TEXT/PLAIN)
public String invoke(Payload json) {
    try {


        return NodeUtils.mapper.writerWithDefaultPrettyPrinter().writeValueAsString(payload);
    } catch (Throwable e) {
        return "ERROR: " + e;
    }
}

Также обратите внимание, что вы возвращаете String, а не json. Поэтому я изменил тип возврата. Если вы хотите вернуть json, просто верните полезную нагрузку.

Убедитесь, что ваши поставщики Jackson зарегистрированы. Я почти уверен, что это уже произошло в dropwizard, но все же стоит проверить.

...