【问题标题】:Map JSON key-value to class in java将JSON键值映射到java中的类
【发布时间】:2021-01-07 16:07:19
【问题描述】:

我需要通过键值将字符串 JSON 映射到 POJO 类,但我不确定是否有更简单的方法来转换它。

我的班级:

class Colors {
    
    private String name;

    private String color;

    public String getName() { return name; }

    public String getColor() { return color; }

}

JSON 示例:

{
    "white": "FFFFFF",
    "red": "FF0000",
    "black": "000000"
}

有没有办法(而不是使用 foreach 循环)在List<Colors> 中包含上述 JSON?

P.s:我尝试了 objectMapper.readValue 的一些相同问题,但没有成功。

【问题讨论】:

标签: java json mapping objectmapper


【解决方案1】:

您可以使用 com.fasterxml.jackson.annotation.JsonAnySetter 注释,这将允许您处理每个 key-value 对:

import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./src/main/resources/test.json");

        ObjectMapper mapper = new ObjectMapper();

        Colors colors = mapper.readValue(jsonFile, Colors.class);
        System.out.println(colors.getColors());
    }
}

class Colors {
    private final List<Color> colors = new ArrayList<>();

    @JsonAnySetter
    public void setAny(String key, String value) {
        colors.add(new Color(key, value));
    }

    public List<Color> getColors() {
        return colors;
    }
}

class Color {

    private String name;
    private String color;

    public Color(String name, String color) {
        this.name = name;
        this.color = color;
    }

    public String getName() {
        return name;
    }

    public String getColor() {
        return color;
    }

    @Override
    public String toString() {
        return "Color{" +
                "name='" + name + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}

上面的代码打印:

[Color{name='white', color='FFFFFF'}, Color{name='red', color='FF0000'}, Color{name='black', color='000000'}]

另见:

【讨论】:

  • 是的...非常感谢!!!!你的方法对我很有效,我的问题已经解决了!
【解决方案2】:

将您的 json 对象更改为:

{
"listcolors": [
    {
        "name": "white",
        "color": "FFFFFF"
    },
    {
        "name": "red",
        "color": "FF0000"
    },
    {
        "name": "black",
        "color": "000000"
    }
]}

你的颜色类应该实现可序列化

 class Colors implements Serializable {

    private String name;

    private String color;

    public String getName() { return name; }

    public String getColor() { return color; }

}

现在创建一个颜色类列表来接收对象的反序列化

class ListColors implements Serializable {
    ArrayList<Color> ListColors = new ArrayList<Color>();
}

然后:

ListColors objColors = new Gson().fromJson(<
        put your json object string here>, Colors.class);

详细了解 GSON 库here

【讨论】:

  • 感谢您的帮助,但由于某种原因,我从另一个 API 获取此 JSON,并且无法更改格式。 :(
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多