gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:06:46 24 4
gpt4 key购买 nike

为了编写某个功能的测试,我必须转换一个包含 [] 的字符串。到 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 对象用于测试目的,但它不起作用。

这是通过 postman 处理的请求(它的工作方式如下,它抛出正确的异常)

{
"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 对象添加空数组。

有人可以帮我吗?

问候,

阿里

最佳答案

尝试在 PostLabelDTO 中使用 labels 作为 String[]

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 请求正文来测试使用此调用的工作情况。

关于java - 将字符串 x = "[]"映射到 JsonNode 会导致额外的引号(Spring Boot),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50647675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com