JSONJackson将多个键反序列化到同一字段中

vdgimpew  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(149)

我正在尝试将JSON转换为POJO。我曾与Jackson合作转换标准JSON文件。在这个特殊的情况下,我想将键值覆盖到“默认”类/变量。在这个情况下,有多个键值要替换(即数百个,要替换的键值未知)。
这可能吗?我想将其存储到Map中,然后迭代并将每个存储到POJO中,但不知道是否有不同的选择,因为我对将JSON存储到Map不太熟悉。
要处理的JSON示例:

"People" : {
    "person1" : { 
      "name" : "john doe",
      "address" : "123 main st",
      "email" : "john@doe.com"
    },
    "person2" : { 
      "name" : "bob cat",
      "address" : "234 dog st",
      "email" : "bob@cat.com"
    },
    "person3" : { 
      "name" : "foo bar",
      "address" : "111  1st ave",
      "email" : "foo@bar.com"
    },
    "person8" : { 
      "name" : "james bono",
      "address" : "999 alaska st",
      "email" : "james@bono.com"
    }
}

有可能生成如下结构的类吗?主要问题是有数百个值要替换,假设它们是未知的,我不能使用这种方法。

@JsonIgnoreProperties(ignoreUnknown = true)
public class People { 

  @JsonAlias({"person1", "person2"})
  private List<Details> person; // --> this should be the default replacing person1, person2, and so on 

  private class Details { 
    String name;
    String address;
    String email;
  }
}
enyaitl3

enyaitl31#

您可以对所有属性personXYZ使用JsonAnySetter注解。请参阅以下示例:

import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.databind.DeserializationFeature;
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("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);

        System.out.println(mapper.readValue(jsonFile, People.class).getPersons());
    }
}

class People {

    private List<Details> persons = new ArrayList<>();

    @JsonAnySetter
    public void setPerson(String name, Details person) {
        this.persons.add(person);
    }

    public List<Details> getPersons() {
        return persons;
    }

    public static class Details {
        String name;
        String address;
        String email;

        // getters, setters, toString
    }
}

对于您的JSON以上代码打印:

[Details{name='john doe', address='123 main st', email='john@doe.com'}, Details{name='bob cat', address='234 dog st', email='bob@cat.com'}, Details{name='foo bar', address='111  1st ave', email='foo@bar.com'}, Details{name='james bono', address='999 alaska st', email='james@bono.com'}]

如果您使用内部类,请记住将其设置为public static,以使其对Jackson示例化进程可见。
另请参阅:

ljsrvy3e

ljsrvy3e2#

只是补充我的两点意见。我认为这种方式看起来更好,也更容易检索数据。Jackson将在不需要任何其他标记或自定义代码的情况下进行反序列化,这一切都很好,并在散列表中排序。
第一个
}

相关问题