如何在java编程中模板化json

如何在java编程中模板化json,java,json,templates,configuration,Java,Json,Templates,Configuration,我的用例是我有一个json文件,但我只需要将其中的几个共享给客户端。 考虑源JSON文件,如下所示。 { "name": "XYZ", "age": 24, "education": { "college": "ppppp", "study": "b.tech", "grade": 6.8 }, "friends": ["kkkk", "bbbbbbbbbbb", "jjjjjj"],

我的用例是我有一个json文件,但我只需要将其中的几个共享给客户端。 考虑源JSON文件,如下所示。

{
    "name": "XYZ",
    "age": 24,
    "education": {
        "college": "ppppp",
        "study": "b.tech",
        "grade": 6.8
    },
    "friends": ["kkkk",
    "bbbbbbbbbbb",
    "jjjjjj"],
    "dob":"01-08-1990"
}
对于客户端1,我必须分享以下输出

{
    "personalInfo": {
        "name": "XYZ",
        "age": 24,
        "friendsNames": ["kkkk","bbbbbbbbbbb","jjjjjj"]
    },
    "educationalInfo": {
        "college": "ppppp",
        "study": "b.tech",
        "grade": 6.8
    }
}
{
    "personalInformation": {
        "nameOfEmployee": "XYZ",
        "ageOfEmployee": 24
    },
    "educationalInformation": {
        "college": "ppppp",
        "study": "b.tech"
    }
}
对于客户端2,我必须分享以下输出

{
    "personalInfo": {
        "name": "XYZ",
        "age": 24,
        "friendsNames": ["kkkk","bbbbbbbbbbb","jjjjjj"]
    },
    "educationalInfo": {
        "college": "ppppp",
        "study": "b.tech",
        "grade": 6.8
    }
}
{
    "personalInformation": {
        "nameOfEmployee": "XYZ",
        "ageOfEmployee": 24
    },
    "educationalInformation": {
        "college": "ppppp",
        "study": "b.tech"
    }
}

对于其他客户机,用例也是一样的,我必须跳过一些键,并为键指定不同的名称。如何通过某种配置动态地实现这一点。我使用jsonPath来实现这一点,但从json对象中删除几个键是很困难的。如果您有任何建议,我们将不胜感激。

如何将其转换为XML,然后创建一些XSLT?它可能更具可读性和更清晰。

您可以使用Jackson来序列化和反序列化json。我建议您创建单独的类来表示您的客户机数据

我将向您展示一个示例,说明如何反序列化数据并将其映射到客户端json

您可以为客户机2生成相应的类,并从中获得一些帮助,以便将json映射到pojo

代码如下:

public class Main {
    public static void main(String[] args) throws ParseException, ParserConfigurationException, IOException, SAXException {

        ObjectMapper mapper = new ObjectMapper();

        Root root = mapper.readValue(new File("test.json"), Root.class);

        Client1 c1 = new Client1();
        PersonalInfo personalInfo1 = new PersonalInfo();
        personalInfo1.setAge(root.getAge());
        personalInfo1.setFriendsNames(root.getFriends());
        personalInfo1.setName(root.getName());

        EducationalInfo educationalInfo1 = new EducationalInfo();
        educationalInfo1.setCollege(root.getEducation().getCollege());
        educationalInfo1.setGrade(root.getEducation().getGrade());
        educationalInfo1.setStudy(root.getEducation().getStudy());

        c1.setPersonalInfo(personalInfo1);
        c1.setEducationalInfo(educationalInfo1);

        mapper.writeValue(new File("client1.json"), c1);
    }
}
内部test.json文件:

{
  "name": "XYZ",
  "age": 24,
  "education": {
    "college": "ppppp",
    "study": "b.tech",
    "grade": 6.8
  },
  "friends": [
    "kkkk",
    "bbbbbbbbbbb",
    "jjjjjj"
  ],
  "dob": "01-08-1990"
}
{
  "personalInfo": {
    "name": "XYZ",
    "age": 24,
    "friendsNames": [
      "kkkk",
      "bbbbbbbbbbb",
      "jjjjjj"
    ]
  },
  "educationalInfo": {
    "college": "ppppp",
    "study": "b.tech",
    "grade": 6.8
  }
}
在client1.json文件中:

{
  "name": "XYZ",
  "age": 24,
  "education": {
    "college": "ppppp",
    "study": "b.tech",
    "grade": 6.8
  },
  "friends": [
    "kkkk",
    "bbbbbbbbbbb",
    "jjjjjj"
  ],
  "dob": "01-08-1990"
}
{
  "personalInfo": {
    "name": "XYZ",
    "age": 24,
    "friendsNames": [
      "kkkk",
      "bbbbbbbbbbb",
      "jjjjjj"
    ]
  },
  "educationalInfo": {
    "college": "ppppp",
    "study": "b.tech",
    "grade": 6.8
  }
}
以下是表示json数据的类:

class Education {
    private String college;
    private String study;
    private float grade;

    public String getCollege() {
        return college;
    }

    public void setCollege(String college) {
        this.college = college;
    }

    public String getStudy() {
        return study;
    }

    public void setStudy(String study) {
        this.study = study;
    }

    public float getGrade() {
        return grade;
    }

    public void setGrade(float grade) {
        this.grade = grade;
    }
}

// root of your base json data
class Root {

    private String name;
    private int age;
    private Education education;
    private List<String> friends;
    private String dob;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Education getEducation() {
        return education;
    }

    public void setEducation(Education education) {
        this.education = education;
    }

    public List<String> getFriends() {
        return friends;
    }

    public void setFriends(List<String> friends) {
        this.friends = friends;
    }

    public String getDob() {
        return dob;
    }

    public void setDob(String dob) {
        this.dob = dob;
    }
}

class EducationalInfo {

    private String college;
    private String study;
    private float grade;

    public String getCollege() {
        return college;
    }

    public void setCollege(String college) {
        this.college = college;
    }

    public String getStudy() {
        return study;
    }

    public void setStudy(String study) {
        this.study = study;
    }

    public float getGrade() {
        return grade;
    }

    public void setGrade(float grade) {
        this.grade = grade;
    }
}

// class which represents client 1 json data
class Client1 {

    private PersonalInfo personalInfo;
    private EducationalInfo educationalInfo;

    public PersonalInfo getPersonalInfo() {
        return personalInfo;
    }

    public void setPersonalInfo(PersonalInfo personalInfo) {
        this.personalInfo = personalInfo;
    }

    public EducationalInfo getEducationalInfo() {
        return educationalInfo;
    }

    public void setEducationalInfo(EducationalInfo educationalInfo) {
        this.educationalInfo = educationalInfo;
    }
}

class PersonalInfo {

    private String name;
    private int age;
    private List<String> friendsNames = null;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<String> getFriendsNames() {
        return friendsNames;
    }

    public void setFriendsNames(List<String> friendsNames) {
        this.friendsNames = friendsNames;
    }
}
课堂教育{
私立弦乐学院;
私人字符串研究;
私人浮动等级;
公共学院(){
返回学院;
}
公立学院(弦学院){
这个学院=学院;
}
公共字符串getStudy(){
回归研究;
}
公共无效设置研究(字符串研究){
这项研究=研究;
}
公共交通等级(){
返回等级;
}
公共坡率(浮动坡率){
这个。等级=等级;
}
}
//基本json数据的根
类根{
私有字符串名称;
私人互联网;
私立教育;
私人名单朋友;
私有字符串dob;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
公共教育{
回归教育;
}
公共教育(教育){
这就是教育;
}
公共列表getFriends(){
回报朋友;
}
公众朋友(列出朋友){
这个。朋友=朋友;
}
公共字符串getDob(){
返回dob;
}
公共void setDob(字符串dob){
this.dob=dob;
}
}
班级教育信息{
私立弦乐学院;
私人字符串研究;
私人浮动等级;
公共学院(){
返回学院;
}
公立学院(弦学院){
这个学院=学院;
}
公共字符串getStudy(){
回归研究;
}
公共无效设置研究(字符串研究){
这项研究=研究;
}
公共交通等级(){
返回等级;
}
公共坡率(浮动坡率){
这个。等级=等级;
}
}
//类,该类表示客户端1 json数据
类别客户1{
个人信息;
私人教育信息;
public PersonalInfo getPersonalInfo(){
返回个人信息;
}
公共无效设置PersonalInfo(PersonalInfo PersonalInfo){
this.personalInfo=personalInfo;
}
公共教育信息获取教育信息(){
返回教育信息;
}
公共无效设置EducationalInfo(EducationalInfo EducationalInfo){
this.educationalInfo=教育信息;
}
}
类个人信息{
私有字符串名称;
私人互联网;
私有列表friendsNames=null;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
公共列表getFriendsNames(){
回报朋友;
}
公共无效设置friendsNames(列出friendsNames){
this.friendsNames=friendsNames;
}
}

我使用libs(lombok和jackson)将完整的java工作示例推入
模板json映射到对象,对象映射到不同客户端的json。

使用json路径库,如。这样,转换您的Exapple的模板将是:

客户1 客户2 您需要实现的是模板遍历。大约有20行代码;或40,如果您还需要转换列表元素,如:

{
    "friends": [ "$.friends[?(@ =~ /.{5,}/)]", {
        "name": "@",
        "since": "$.dob"
    } ]
}
这将导致:

{
    "friends": [ {
        "name": "bbbbbbbbbbb",
        "since": "01-08-1990"
    }, {
        "name": "jjjjjj",
        "since": "01-08-1990"
    } ]
}

类似的问题我喜欢你的方法,但我唯一担心的是将来如果客户要求不同的Json模板,我必须修改我的源代码,是否有任何方法可以加载客户要求的Json并从源代码填充值?如果客户希望看到另一个结构,当然,您需要更改Java代码。另一个结构是数据交换服务的新版本。您可以看到SOAP如何在WSDL上工作以及服务的兼容性。我的示例非常适合添加新客户来处理相同的数据。但添加新元素或更改答案的结构总是会导致代码更改。您可以将文本模板与变量一起使用并替换数据中的变量,而无需使用java对象并将其转换为JSONSee how work“freemarker”-这是最好的引擎之一,请您回答,如果将来客户端要求不同的Json模板,我必须修改我的源代码,是否有任何方式可以加载客户端所需的json并从源代码填充值?