代码之家  ›  专栏  ›  技术社区  ›  Joseph Gagnon

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

  •  0
  • Joseph Gagnon  · 技术社区  · 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吗?如果是,我该怎么办?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Radha Mohan Maheshwari    1 年前

    您的示例json是错误的,请在json下面 { “name”:“gitlab_pipeline_success_total”, “描述”:“废话废话”, “类型”:“计数器”, “标签”:[ 项目 “其他东西” ], 数据 { “值”:1.0, “时间戳”:0, “操作”:“增量”, “labelValues”: { “项目”:“opoe”, “其他东西”:“垃圾” }

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

    }