修改 json 字符串中的 属性 值

Modify a property value in json string

我有一个 json 这样的字符串

{
  "code": "200",
  "data": "",
  "datadetail": null,
  "message": "Khách hàng không tồn tại",
  "description": "KH_NOTFOUND:"
}

因为data属性的值是""所以对象映射器不能不把那个字段映射到JavaPOJO中,反正就是要修改data[=的值34=] 到如下所示的特定字符串

 {
  "code": "200",
  "data": "no data",
  "datadetail": null,
  "message": "Khách hàng không tồn tại",
  "description": "KH_NOTFOUND:"
}

这里是错误

详情

Can not instantiate value of type [collection type; class java.util.ArrayList, contains [simple type, class vnptpay.collection.adapter.partner.water.laichau.Datum]] from String value (''); no single-String constructor/factory method

这是我的目标 java 对象 class 映射

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"code",
"data",
"datadetail",
"message",
"description"
})
@JsonIgnoreProperties(ignoreUnknown = true)
public class GetBillResponse implements Serializable{

@JsonProperty("code")
private String code;
@JsonProperty("data")
private ArrayList<Datum> data = null;
@JsonProperty("datadetail")
private Object datadetail;
@JsonProperty("message")
private String message;
@JsonProperty("description")
private String description;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

这是我的映射代码

ObjectMapper mapper = new ObjectMapper();
GetBillResponse obj = null;

obj = mapper.readValue(output.toString(), GetBillResponse.class);

假设 output.toString() 是您的 JSON 字符串,您可以添加 .replace("\"\"", \"{none}\")。 Java 应该 能够将其解释为具有一个元素的 ArrayList(也许我的语法错误,但肯定有一种方法可以从字符串初始化 ArraList)。

编辑:现在我考虑一下,您可能需要 JSON-syntax,而不是 Java-syntax,所以 .replace("\"\"", \"[]\ ") 或类似的东西。

如评论中所述,您映射的类型有误。

在你的JSON中"data": ""指的是一个String字段名data。当 java 代码映射它时,由于传递的默认值是一个字符串,它会尝试寻找一个 ArrayList 构造函数,该构造函数采用您将其定义为列表的字符串您的 Java 代码:

@JsonProperty("data")
private ArrayList<Datum> data = null;

所以你现在有两个选择:

  • 您发送一个有效的 JSON 数组,它将映射到列表,如 "data": []。 (假设你有一个像 Datum(String value) 这样的构造函数)

  • 您将 java 代码中的数据映射更改为 String 并稍后将其映射到 ArrayList(例如,如果您将逗号左右的字符串)

此外,我不建议您将数据映射到 ArrayList,而是将其映射到 List,因为它引用接口而不是实现是常见的最佳实践!