修改 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,因为它引用接口而不是实现是常见的最佳实践!
我有一个 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,因为它引用接口而不是实现是常见的最佳实践!