将 JSON 数据转换为 Java Map 时出现问题

问题描述 投票:0回答:1

我正在尝试在 YAML 和 JSON 格式之间对 Java 对象进行序列化和反序列化。我正在使用杰克逊库来完成繁重的工作。我在尝试将 JSON 解析为对象时遇到了问题,并意识到 JSON 似乎不支持映射结构。

这是 Java 类:

public class MetricData {

  public enum Operation {
    INCREMENT, DECREMENT, SET;

    @JsonCreator
    public static Operation getType(String value) {
      return valueOf(value.toUpperCase());
    }

    @JsonValue
    public String value() {
      return name().toLowerCase();
    }
  }

  private Double              value;
  private Long                timestamp;
  private Operation           operation = Operation.INCREMENT;
  private Map<String, String> labelValues;

  // getters/setters removed
}

注意字段

labelValues
,它是一个带有字符串键和值的映射。

然后,我设置了一个测试 JSON 文件并尝试将 JSON 转换为 Java 对象。

{
    "name": "gitlab_pipeline_success_total",
    "description": "blah blah blah",
    "type": "counter",
    "labels": [
        "project",
        "something-else"
    ],
    "data": [
        {
            "value": 1.0,
            "timestamp": 0,
            "operation": "increment",
            "labelValues": [
                {
                    "project": "opoe"
                },
                {
                    "something-else": "junk"
                }
            ]
        },
        {
            "value": 3,
            "timestamp": 0,
            "operation": "set",
            "labelValues": [
                {
                    "project": "dex"
                }
            ]
        }
    ]
}

据我所知,这是有效的 JSON,但是当我运行该程序时,出现异常:

[ERROR] 2024-02-02 07:41:20.550 [main] org.springframework.boot.SpringApplication.reportFailure(SpringApplication.java:851) - Application run failed
com.fasterxml.jackson.databind.RuntimeJsonMappingException: Cannot deserialize value of type `java.util.LinkedHashMap<java.lang.String,java.lang.String>` from Array value (token `JsonToken.START_ARRAY`)
 at [Source: (File); line: 14, column: 19] (through reference chain: com.beastcode.devops.prometheusbroker.domain.Metric["data"]->java.util.ArrayList[0]->com.beastcode.devops.prometheusbroker.domain.MetricData["labelValues"])

有没有一种方法可以构造 JSON,使其可以“转换”为 Java 映射结构?或者,从另一个方向看,我是否应该重构我的类以使其更加 JSON“友好”,如果是,我应该做什么?

java json dictionary jackson
1个回答
0
投票

您的示例 json 错误,请低于 json { “名称”:“gitlab_pipeline_success_total”, “描述”:“等等等等”, “类型”:“计数器”, “标签”: [ “项目”, “其他东西” ], “数据”: [ { “值”:1.0, “时间戳”:0, “操作”:“增量”, “标签值”: { “项目”:“opoe”, “其他东西”:“垃圾” }

    },
    {
        "value": 3,
        "timestamp": 0,
        "operation": "set",
        "labelValues": 
            {
                "project": "dex"
            }
        
    }
]

}

© www.soinside.com 2019 - 2024. All rights reserved.