当前位置: 首页 > 知识库问答 >
问题:

如何解析字段,该字段可能是字符串,也可能是 Jackson 的数组

李俭
2023-03-14

我是java和objectMapper的新手。我正在尝试解析json字段,该字段可能具有两种类型,它可能是字符串或数组。

例如:

{
  "addresses": [],
  "full_name": [
    "test name_1",
    "test name_2"
  ],
}

{
{
  "addresses": [],
  "full_name": "test name_3",
}
}

示例


@JsonIgnoreProperties(ignoreUnknown = true)
@Data -> lombok.Data
public class Document {

    private List<String> addresses;

    @JsonProperty("full_name")
    private String fullName;
}

我使用objectMapper来反序列化json,当“full_name”字段有一个字符串时可以正常工作,但是当数组到达时,数组无法反序列化。

这个想法是,当到达一个字符串时,将值放在属性中,但当到达数组时,将数组元素连接为字符串(String.join (",", 值))

可以在类方法中应用自定义反序列化吗?例如,setFullName()(使用lombok.Data)

我在这个网站上看到了其他的例子,但没有工作。

谢谢,谢谢

共有3个答案

毛峻
2023-03-14

这两个答案都很棒。我只想提一下自定义解串器。

您可以轻松地从StdDeserializer扩展

public class DocumentDeserializer extends StdDeserializer<Document> {

    @Override
    public Document deserialize(JsonParser p, DeserializationContext ctxt, Document value) throws IOException {

        JsonNode root = p.getCodec().readTree(p);
        JsonNode node = root.get("full_name");
        if(node.isArray()) {
            //get array data from node iterator then join as String and 
            //call setFirstName
        }
        return value;
    }
}

然后,不要忘记调用< code>ObjectMapper的< code>registerModule来注册您的< code >反序列化器

凌经赋
2023-03-14

详述@Deadpool答案,您可以使用setter接受数组,然后将其连接到字符串:

@JsonProperty("full_name")
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
void setFullName(String[] name)
{
    this.fullName = String.join(",", name);
}
从建明
2023-03-14

从杰克逊2.6你可以使用JsonFormat。feature . ACCEPT _ SINGLE _ VALUE _ AS _数组

@JsonProperty("full_name")
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private String[] fullName;
 类似资料:
  • 问题内容: 我是java和objectMapper的新手。我正在尝试解析json字段,该字段可能是键具有两种类型,它可以是字符串或数组。 例子: 要么 类的例子: 我使用objectMapper来反序列化json,当“ full_name”字段具有字符串但到达数组时无法反序列化时,它可以正常工作。 这个想法是,当到达属性时将字符串放入值,但到达数组时,将de数组元素串联为字符串(String.jo

  • 问题内容: 我在解组一些我无法控制的Json时遇到麻烦。在一个字段中,有99%的时间是字符串,但偶尔是数组。 杰森如下: 错误:json:无法将数组解组为字符串类型的Go结构字段MyListItem.display_name 问题答案: 使用json.RawMessage捕获变化的字段。 使用json“-”名称对解码器隐藏字段。顶级JSON解码后,应用程序将填充此字段。 解组顶级JSON: 根据原

  • 问题内容: 我正试图解组该文件: 进入这个结构: 使用以下说明: 问题是在“ json-schema@0.2.3”中,我们有一个许可证数组而不是一个字符串,由于这个原因,我显然得到了 有没有一种方法可以自动处理可以是数组或字符串的字段? 谢谢 问题答案: 不幸的是,软件包没有提供真正的自动解决方案。 但是您可以将依赖项解组为a 而不是。只是一个,因此您可以根据第一个字节确定消息的类型。 例: 另一

  • 发生了严重的错误。 我有 我需要准备要传递给Spring jdbcTemplate的对象数组。然而,由于某些原因,ArrayList中的元素被视为字符串,因此在执行jdbcTemplate时会中断,抱怨它无法从字符串转换为int。然后我尝试在循环中转换,看看这是否有帮助:-\显然,我不能做Integer。parseInt作为IDE正确地将其视为整数。每当我将整数a=Activities分配给Del

  • 问题内容: 在我们的应用程序中,我们需要具有只能分配一次的字段。 最初,我们想到封装字段并将设置程序设为私有。但是,引起一些问题: 如果没有公共设置者,Hibernate是否仍然可以从数据库映射字段? 我是否可以剥离设置器并使字段仅在实体构造函数中可变? 最后,是否有任何标准的JPA方法使字段不变? 提前致谢。 问题答案: 广告。1:我相信,如果将注释放在字段而不是在getter上,则JPA会将普

  • 我有课 其中field 如果使用ObjectMapper反序列化此对象 结果是这样的: 添加了转义(\),并且json字段有引号(")。如何正确摆脱这一点并制作单个JSON?像这样: