将字符串x =“[]”映射到JsonNode会导致额外的引号(Spring Boot)

时间:2018-06-01 16:31:46

标签: java json spring spring-boot jackson

为了编写某个特性的测试,我必须将包含[]的字符串强制转换为JsonNode。

问题是当它映射到JsonNode时,它似乎正在为它添加额外的引号。

我期待“[]”,但我得到的是“”[]“”,这会导致测试失败。当我在正常操作中调试代码时,在使用Postman测试代码时,我只得到“[]”,而不是在测试期间我只能得到的不工作“”[]“”。

这就是我的DTO在Spring Boot中的样子

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonNode;

public class PostLabelDTO {


    private final String templateId;

    private final String labels;

    @JsonCreator
    public PostLabelDTO(
            final @JsonProperty("templateId") String templateId,
            final @JsonProperty("labels") JsonNode labels
    ) {
        this.templateId = templateId;
        this.labels = labels.toString();
    }

    public String getId() {
        return templateId;
    }

    public String getData() {
        return labels;
    }
}

我的测试必须伪造这个对象,并将属性传递给将要测试的方法。

我的测试看起来像这样:

@Test
    public void getEmptyDocumentException() throws InvalidBarcodeException, EmptyStringException, InvalidBarcodeGeometryException, EmptyFieldException, TemplateNotFoundException, InvalidBarcodeStrategyException {

        //defining an ID for the templateId JsonProperty
        final String templateId = "fj2j931j2ijd1";

        //this is the "labels" JsonNode that gets sent in through the Post request
        //i checked 10 times how the value comes into the DTO and it was always "[]" (empty labels (document) object, for which I wrote this test for)

        final String jsonString = "[]";

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(JsonParser.Feature.ALLOW_MISSING_VALUES);

        JsonNode labels = mapper.valueToTree(jsonString);


        //when I do this, the "[]" which is normally passed into the PostLabelDTO, becomes ""[]"", so there are extra quotes added
        PostLabelDTO dto = new PostLabelDTO(templateId, labels);

        final Document document = new Document(dto, templateRepository);
        Exception resultingException = null;

        try {
            document.getPDF();
        } catch (Exception e) {
            e.printStackTrace();


            assertThat(resultingException).isExactlyInstanceOf(EmptyDocumentException.class);
        }

    }

所以基本上我尝试将上面的Json放到PostLabelDTO的新实例中作为labels JsonNode对象用于测试目的,但它不起作用。

这是通过邮递员工作的请求(它起作用,它会抛出正确的异常)

{
    "templateId":"5b1140608134691d1804e74e",
    "labels":[]
}

所以基本上我尝试将上面的Json放到PostLabelDTO的新实例中作为labels JsonNode对象用于测试目的,但它不起作用。

这是一个工作请求(返回带有标签的PDF,每个页面都带有标签)

{
    "templateId": "5b1140608134691d1804e74e",
    "labels": [{
        "data": {
            "Ivolgnr": "Volgnr",
            "Ilkw-nr": "Ilkw-nr",
            "bedrijf": "Hornbach",
            "wagenNr": "13513542626",
            "barcode": {
                "waarde": "9780471117094"
            },
            "leverdatumVan": "x",
            "leverdatumNaar": "x",
            "orderList": [{
                    "order": [{
                            "articlenumber": "29-840-4512"
                        },
                        {
                            "description": "Mooie grote plant"
                        },
                        {
                            "ordernumber": "3584479012860361"
                        },
                        {
                            "amount": "20"
                        },
                        {
                            "sellprice": "€5,00"
                        },
                        {
                            "deliverydate": "01-09-2018"
                        }
                    ]
                },
                {
                    "order": [{
                            "articlenumber": "29-840-4512"
                        },
                        {
                            "description": "Mooie grote plant"
                        },
                        {
                            "ordernumber": "3584479012860361"
                        },
                        {
                            "amount": "20"
                        },
                        {
                            "sellprice": "€5,00"
                        },
                        {
                            "deliverydate": "01-09-2018"
                        }
                    ]
                },
                {
                    "order": [{
                            "articlenumber": "29-840-4512"
                        },
                        {
                            "description": "Mooie grote plant"
                        },
                        {
                            "ordernumber": "3584479012860361"
                        },
                        {
                            "amount": "20"
                        },
                        {
                            "sellprice": "€5,00"
                        },
                        {
                            "deliverydate": "01-09-2018"
                        }
                    ]
                },
                {
                    "order": [{
                            "articlenumber": "29-840-4512"
                        },
                        {
                            "description": "Mooie grote plant"
                        },
                        {
                            "ordernumber": "3584479012860361"
                        },
                        {
                            "amount": "20"
                        },
                        {
                            "sellprice": "€5,00"
                        },
                        {
                            "deliverydate": "01-09-2018"
                        }
                    ]
                },
                {
                    "order": [{
                            "articlenumber": "29-840-4512"
                        },
                        {
                            "description": "Mooie grote plant"
                        },
                        {
                            "ordernumber": "3584479012860361"
                        },
                        {
                            "amount": "20"
                        },
                        {
                            "sellprice": "€5,00"
                        },
                        {
                            "deliverydate": "01-09-2018"
                        }
                    ]
                }

            ]
        }
    }, {
        "data": {
            "Ivolgnr": "22324rff",
            "Ilkw-nr": "246426246",
            "bedrijf": "bedrijfffff",
            "wagenNr": "wagennrrrrrrr",
            "barcode": {
                "waarde": "9780471117094"
            },
            "leverdatumVan": "x",
            "leverdatumNaar": "x",
            "orderList": [{
                "order": [{
                        "articlenumber": "a"
                    },
                    {
                        "description": "b"
                    },
                    {
                        "ordernumber": "c"
                    },
                    {
                        "amount": "d"
                    },
                    {
                        "sellprice": "e"
                    },
                    {
                        "deliverydate": "f"
                    }
                ]
            }]
        }
    }]
}

注意 标签的模式(在此请求中称为每个标签的数据)总是可以根据用于填充的模板而变化。因此,不可能使Label对象包含所有属性,因为这些属性总是不同(取决于要用此请求填充的模板的HTML。我的服务根据标记属性名称执行“搜索和替换”

我已经尝试过了: How to parse a JSON string into JsonNode in Jackson?

但我似乎无法向JsonNode对象添加一个空数组,因为它应该是。

有人可以帮帮我吗?

此致

阿里

2 个答案:

答案 0 :(得分:1)

所以,基本上你在代码中拥有的是: final String jsonString = "[]";

但是,在邮递员的请求中,您发送的labels类型为Array,而不是String类型。

由于此处没有太多信息,您可以查看此机构:

{
"templateId":"5b1140608134691d1804e74e",
"labels":"[]"
}

并分享输出,甚至这种(类型的差异)可能有助于您理解在尝试将数组转换为String类型时所面临的意外行为。在测试类中,您应该尝试从arrayType获取JsonNode String[] labels in test class

更新: 使用String []代替String标记时,您需要在从JsonNode获取String []时提供传递类型。 Refer to this link on how to do that

答案 1 :(得分:1)

尝试在labels

中使用String[]作为PostLabelDTO
public class PostLabelDTO {

    private final String templateId;

    private final String[] labels;

    public String[] getLabels() {
        return labels;
    }

    @JsonCreator
    public PostLabelDTO(final @JsonProperty("templateId") String templateId,
            final @JsonProperty("labels") String[] labels) {
        this.templateId = templateId;
        this.labels = labels;
    }

    public String getId() {
        return templateId;
    }

}

然后测试以下代码:

String str[] = {};
PostLabelDTO postLabelDTO = new PostLabelDTO("fj2j931j2ijd1", str);

对于使用那个大JSON的实际请求,您应该有PostLabelDTO,如下所示

public class PostLabelDTO {

@JsonProperty("templateId")
private String templateId;
@JsonProperty("labels")
private List<Label> labels = null;
....
}

尝试使用jsonschema2pojo链接从JSON生成POJO,它将生成正确的JAVA类,您可以使用实际的JSON请求体测试使用此调用的工作。