【问题标题】:Mapping a Json placeholder file to java Object将 Json 占位符文件映射到 java 对象
【发布时间】:2020-10-02 08:38:34
【问题描述】:

所以我有以下 JSON 来表示我想映射到 JAVA 中的对象的 City 对象。 这用于过滤掉不需要的字段

   {
  "class": [
    {
      "id": "default",
      "type": [
        "riskType",
        "firstTime"
      ],
      "direction": [],
      "town": [
        "leader",
        {
          "streets": [
            "mainStreet"
          ]
        }
      ]
    }
  ]
}

为了映射它,我使用了 ojectMapper.readValue(inputStream, new TypeReference<HashMap<String, Set<PayloadClass>>>() { });

我的payload类如下:

@Data
@EqualsAndHashCode(exclude = {"town", "direction", "type"})
@NoArgsConstructor
public class PayloadClass {
private String id;
@NonNull private Set<String> type = Collections.emptySet();
@NonNull private Set<String> direction = Collections.emptySet();
@NonNull private Set<Town> town = Collections.emptySet();

我的城镇等级是为了代表一个城镇有领导和街道

@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Town{

@JsonProperty(value = "leader")
private String leader;

@JsonProperty(value = "streets")
private Set<String> streets = Collections.emptySet();

问题在于映射,它试图在一个对象内映射领导者和街道集。

然后我收到以下错误,但不确定原因:

U [main] ERROR - Cannot construct instance of ` 
com.Town` (although at least one Creator 
exists): no String-argument constructor/factory method to deserialize from String value 
('leader')
at [Source: (BufferedInputStream); line: 16, column: 9] (through reference chain: 
java.util.HashMap["PayloadClass"]->java.util.HashSet[0]- 
com.PayloadClass["town"]->java.util.HashSet[1])

我正在尝试为上游应用程序保留这种格式的 JSON,希望我可以在映射类型中解决这个问题。

所以我要添加的新字段是 Json 中的领导者字段。如果没有此字段,它会毫无问题地执行。

【问题讨论】:

  • 如果 town 是一个对象数组,你应该写在 json 中: "town": [ { "leader", { "streets": [ "mainStreet" ] } ]
  • @GweltazNiquel 我试过了,但它在 IDE 中抱怨 ||ERROR: ':' expected, got ',' ||用逗号跟在“leader”之后
  • 您是否有公开可见的领导者的获取者/设置者?见:baeldung.com/jackson-field-serializable-deserializable-or-not

标签: java json jackson set objectmapper


【解决方案1】:

您的 json 格式错误。如果 town 是一个城市对象数组,带有一个领导者和一个街道名称数组,你应该写在 json 中:

{
  "town": [
    {
      "leader": "",
      "streets" :  [
        "mainStreet"
      ]
    }
  ]
}

【讨论】:

  • 我会但在有效负载中显示为:“PayloadClass(id=default, type=[riskType, firstTime], direction=[], town=[town(leader=, street=[ mainStreet]),我不希望在领导者之后使用“=”并让它以与“类型”相同的格式拾取有效负载,因为它是字符串集
猜你喜欢
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 2022-07-13
  • 2012-04-23
相关资源
最近更新 更多