修改json字符串中的属性值

时间:2019-08-20 06:55:58

标签: java json objectmapper

我有一个像这样的json字符串

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

因为data属性的值为“”,所以对象映射器无法将该字段映射到Java POJO中,无论如何是将data属性的值修改为如下所示的特定字符串

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

这是错误1

详细信息

  

无法实例化类型[collection type;的值;类java.util.ArrayList,包含来自字符串值(“)的[简单类型,类vnptpay.collection.adapter.partner.water.laichau.Datum]];没有单字符串构造函数/工厂方法

这是我要映射的目标Java对象类

@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);

2 个答案:

答案 0 :(得分:0)

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

编辑:现在我考虑了一下,您可能需要JSON语法而不是Java语法,因此.replace(“ \” \“”,\“ [] \”)或类似的东西。

答案 1 :(得分:0)

如评论中所述,您正在从错误的类型进行映射。

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

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

所以您现在有2个选项:

  • 您发送了一个有效的JSON数组,该数组将映射到"data": []之类的列表中。 (假设您有一个Datum(String value)之类的构造函数)

  • 您将Java代码中的数据映射更改为 String ,并稍后将其映射至ArrayList(如果对于实例,您将字符串拆分为逗号左右)

    < / li>

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