我的函数需要获取一个可以表示任何类型JSON对象的输入String,清理空字段并将其转换回String。
给定此输入JSON,我希望删除门
字段:
String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : \"\"}";
我试图与< code>Jackson和这篇文章合作,得到了这个:
private static void jacksonConvert(String inputJSON) throws IOException{
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); // tried each of the 3 options. Non of them worked
mapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
Object jacksonObj = mapper.readValue(inputJSON, Object.class);
String json = mapper.writeValueAsString(jacksonObj);
System.out.println(json); // {"brand":"Mercedes","doors":""} why "doors" is here?
}
然而,门
字段在输出中不断出现...
我错过了什么?
发现了这个伟大的工作示例,我将在这里复制给后代。
STACIE博客的一个小调整是我更新了
else if (value instanceof ArrayNode) {
ret.set(key, removeEmptyFields((ArrayNode)value));
}
要捕获并删除空数组,请执行以下操作:
else if (value instanceof ArrayNode) {
if (value.size() > 0){
ret.set(key, removeEmptyFields((ArrayNode)value));
}
}
完整的工作代码是这样的:
public static String removeEmptyElements(String json){
try{
ObjectMapper mapper = new ObjectMapper();
ObjectNode before = mapper.readValue(json, ObjectNode.class);
ObjectNode after = removeEmptyFields(before);
String afterString = mapper.writeValueAsString(after);
return afterString;
}catch(JsonProcessingException e){
log.error("Error while cleaning json: {}", e.getMessage());
return json;
}
}
private static ObjectNode removeEmptyFields(final ObjectNode jsonNode) {
ObjectNode ret = new ObjectMapper().createObjectNode();
Iterator<Map.Entry<String, JsonNode>> iter = jsonNode.fields();
while (iter.hasNext()) {
Map.Entry<String, JsonNode> entry = iter.next();
String key = entry.getKey();
JsonNode value = entry.getValue();
if (value instanceof ObjectNode) {
Map<String, ObjectNode> map = new HashMap<String, ObjectNode>();
map.put(key, removeEmptyFields((ObjectNode)value));
ret.setAll(map);
}
else if (value instanceof ArrayNode) {
if (value.size() > 0){
ret.set(key, removeEmptyFields((ArrayNode)value));
}
}
else if (value.asText() != null && !value.asText().isEmpty()) {
ret.set(key, value);
}
}
return ret;
}
private static ArrayNode removeEmptyFields(ArrayNode array) {
ArrayNode ret = new ObjectMapper().createArrayNode();
Iterator<JsonNode> iter = array.elements();
while (iter.hasNext()) {
JsonNode value = iter.next();
if (value instanceof ArrayNode) {
ret.add(removeEmptyFields((ArrayNode)(value)));
}
else if (value instanceof ObjectNode) {
ret.add(removeEmptyFields((ObjectNode)(value)));
}
else if (value != null && !value.textValue().isEmpty()){
ret.add(value);
}
}
return ret;
}
文档说明使用了这些枚举...
定义 Java Bean 的哪些属性要包含在序列化中
但是,如果您要序列化到Object
,Jackson会将该对象实例化为Map
。映射条目不被视为属性。因此Json.Include
不适用。
编辑
关于删除空节点有一个现有的答案(如果你把它序列化为JsonNode
,但没有一个答案让我感到特别高性能。
我从JSON文件中获取文本字段并将它们放入MySQL数据库。例如,SQL不关心表情符号代码\xF0\x9F\x98\x81。当尝试将此数据插入行时,它会显示“不正确的字符串值”。 我在这里有点不知所云,但我认为这是表情符号的UTF-8代码,在这里是笑脸。 我正在使用一个基于java的ETL客户端(Pentaho的Spoon)获取JSON数据并将其传递给MySQL数据库。 问题是,我不知道如何编写代
问题内容: 我有一个提琴手设置,当我单击重置按钮时,它应该清除输入控件,这似乎有效,但是当输入 是否有我不了解的问题或东西。 当我设定 这似乎清除了其他输入类型,但未清除输入type =’url’。 有人知道为什么吗? 问题答案: 当您在input [type =“ url”]中没有有效值时,就会看到您遇到的问题。无效值仅停留在视图( 输入字段 )中,不会被推送到ng- model内部的scope
问题内容: 我在Hibernate中有类似以下模型的内容: 我现在想将Person持久化到一个表,该表中所有person的地址都被序列化为JSON字符串并存储在Person表的一列中。数据库中的“个人”记录如下所示: 有没有办法使用Hibernate来做到这一点? 如果地址不是列表,我可以注册一个UserType来执行序列化。 我也不能使用JPA的@Converter,因为Hibernate实现不
我正在尝试将数据框中的几个字段写入 JSON。数据框中的数据结构是 现在,我正试图将col1到col4字段转换为JSON,并为JSON字段命名 预期产出 我为此写了一个udf。 这就是我的结果 如您所见,它们没有分组。是否有使用UDF本身对这些行进行分组的方法。我是scala/Spark的新手,无法找到合适的udf。
问题内容: 我正在努力解决这个问题。我有一个JSON文件,需要将其放到CSV中,如果结构是扁平的,没有深层嵌套的项目,就可以了。 但是在这种情况下,嵌套会使我烦恼。 我将如何以这种格式获取数据: 每个对象和对象中的每个种族? 我想这样输出到CSV: 所以首先我得到正确的密钥: 然后添加数据: 但是如何? 对于您熟练的forlooper来说,这应该是一个有趣的过程。 问题答案: 我只收集第一个对象的
问题内容: 我正在使用VS2008Express在NET3.5SP1中构建winForms应用程序。我正在尝试使用System.Web.Script.Serialization库反序列化对象。 错误是:数组反序列化不支持类型’jsonWinForm.Category’。 干杯! 问题答案: 很高兴您发现自己的错误。如果您正在寻找用于JSON序列化的其他工具,则可能需要尝试JSON.Net。