java - Json同名序列化和反序列化

标签 java json serialization jackson json-deserialization

当我使用请求正文调用我的 API 时,我使用 POJO 中的变量名称对其进行反序列化。我修改相同的列表并返回,但它重复了列表

@JsonSerialize
@JsonIgnoreProperties(ignoreUnknown = true)
public class UASchema {

    @JsonProperty("metric_id")
    private ArrayList<String> fMetricId;
    @JsonProperty("schema")
    private ArrayList<String> fSchema;
    @JsonProperty("hash")
    private String fHash;
...
...
//getter and setters
}

请求正文是

{
    "data" : [
        {
            "metric_id": ["k1", "ak2", "d90"],
            "schema": ["s1", "s2"]
        },
        {
            "metric_id": ["k21", "k22"],
            "schema": ["a11", "s22"]    
        }
    ]
}

我得到的响应是(添加哈希)

{
    "result": [
        {
            "fmetricId": [
                "k1",
                "ak2",
                "d90"
            ],
            "fschema": [
                "s1",
                "s2"
            ],
            "metric_id": [
                "k1",
                "ak2",
                "d90"
            ],
            "schema": [
                "s1",
                "s2"
            ],
            "hash": "389abc9093442cfd2aee1f20807ba467"
        },
        {
            "fmetricId": [
                "k21",
                "k22"
            ],
            "fschema": [
                "a11",
                "s22"
            ],
            "metric_id": [
                "k21",
                "k22"
            ],
            "schema": [
                "a11",
                "s22"
            ],
            "hash": "5f366dde65b69fa679f95a81f3115b7f"
        }
    ]
}

它重复列表并且未正确序列化它。我希望响应与请求正文具有相同的列表,并且我添加了哈希值。

最佳答案

看起来您的算法重复了条目,或者您手动生成了复制输出的 getterssetters 。默认情况下,Jackson 不会添加额外的条目。请参阅下面的示例,了解如何做到这一点,我在 IDE 中生成了 getterssetters。字段的 f-fieldName 模式已过时,您应该使用常规名称。例如,参见 Google's Java Guide :

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

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

public class JsonApp {

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

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        Root root = mapper.readValue(jsonFile, Root.class);
        root.getData().forEach(s -> s.setfHash(UUID.randomUUID().toString()));

        System.out.println(mapper.writeValueAsString(root));
    }
}

class Root {
    private List<UASchema> data;

    public List<UASchema> getData() {
        return data;
    }

    public void setData(List<UASchema> data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "Root{" +
                "data=" + data +
                '}';
    }
}

class UASchema {

    @JsonProperty("metric_id")
    private List<String> fMetricId;

    @JsonProperty("schema")
    private List<String> fSchema;

    @JsonProperty("hash")
    private String fHash;

    public List<String> getfMetricId() {
        return fMetricId;
    }

    public void setfMetricId(List<String> fMetricId) {
        this.fMetricId = fMetricId;
    }

    public List<String> getfSchema() {
        return fSchema;
    }

    public void setfSchema(List<String> fSchema) {
        this.fSchema = fSchema;
    }

    public String getfHash() {
        return fHash;
    }

    public void setfHash(String fHash) {
        this.fHash = fHash;
    }

    @Override
    public String toString() {
        return "UASchema{" +
                "fMetricId=" + fMetricId +
                ", fSchema=" + fSchema +
                ", fHash='" + fHash + '\'' +
                '}';
    }
}

上面的代码打印:

{
  "data" : [ {
    "metric_id" : [ "k1", "ak2", "d90" ],
    "schema" : [ "s1", "s2" ],
    "hash" : "80dcf06d-1d83-463c-afb8-edef8efdc71f"
  }, {
    "metric_id" : [ "k21", "k22" ],
    "schema" : [ "a11", "s22" ],
    "hash" : "a83d7981-4b80-4318-a632-f3c91d14379b"
  } ]
}

关于java - Json同名序列化和反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57561637/

相关文章:

javascript - Angular JS 全选/取消全选复选框如何检索所选信息

java - 反序列化可以是整数或字符串的值

java - 使用 Jackson 将 Json 数组拆分为单个 Json 元素

java - Spring应用程序中后端消息的国际化支持

java - "E/RecyclerView: No adapter attached; skipping layout"

django - 如果值为空,则自定义 Django Rest Framework Serializer 字段未运行 `to_representation()`

java - 序列化与防止按钮、链接等被点击两次有什么关系吗?

java - 何时在 Java 中使用单一方法接口(interface)

java - 有没有办法知道json代表的是哪种类型?

vb.net - 使类可序列化