Java JSON对象结构的模型泛型类

Java JSON对象结构的模型泛型类,java,json,model,jackson,Java,Json,Model,Jackson,我需要将以下JSON格式读入我的模型类中,我能够做到,但我想消除了解不同分支位置的依赖性,例如nyc,boston 我不知道如何修改此实现以读取JSONObject 我想让它成为通用的,这样它就可以在不更改任何代码的情况下读取新的分支信息。示例:charlotte。对于我的案例,其他JSON结构仍然是标准的。我在我的Model类中使用Builder模式 注意:如果有任何建议修改JSON结构以适应新的位置,以便实现成为通用的我愿意讨论。 这是我正在研究的JSON: { "company": "

我需要将以下
JSON
格式读入我的模型类中,我能够做到,但我想消除了解不同分支位置的依赖性,例如
nyc
boston

我不知道如何修改此实现以读取JSONObject

我想让它成为
通用的
,这样它就可以在不更改任何代码的情况下读取新的分支信息。示例:
charlotte
。对于我的案例,其他JSON结构仍然是标准的。我在我的
Model
类中使用
Builder
模式

注意:如果有任何建议修改
JSON
结构以适应新的位置,以便实现成为
通用的
我愿意讨论。

这是我正在研究的JSON:

{
  "company": "abc inc",
  "logoUrl": "someUrl",
  "phone": "1234567890",
  "branch": {
    "nyc": {
      "products": {
        "asian": {
          "somekey1": "someValue1",
          "somekeyN": "somevalueN"
        },
        "american": {
          "somekey1": "someValue1",
          "somekeyN": "somevalueN"
        }
      }
    },
    "boston": {
      "products": {
        "asian": {
          "somekey1": "somevalue1",
          "somekeyN": "somevalueN"
        },
        "american": {
          "somekey1": "somevalue1",
          "somekeyN": "somevalueN"
        }
      }
    },
    "charlotte": {
      "products": {
        "asian": {
          "somekey1": "somevalue1",
          "somekeyN": "somevalueN"
        },
        "american": {
          "somekey1": "somevalue1",
          "somekeyN": "somevalueN"
        }
      }
    }
  }
}
以下是我的模型课程:

@JsonDeserialize( builder = Content.Builder.class)
public class Content {

    private final String company;
    private final String logoUrl;
    private final String phone;
    private final Branch branch;


    private Content(Builder builder){
        this.company = builder.company;
        this.logoUrl = builder.logoUrl;
        this.phone = builder.phone;
        this.branch = builder.branch;
    }

    public String getCompany() {
        return company;
    }

    public String getLogoUrl() {
        return logoUrl;
    }

    public String getPhone() {
        return phone;
    }

    public Branch getBranch() {
        return branch;
    }

    @JsonIgnoreProperties( ignoreUnknown = true)
    public static class Builder {
        private String company;
        private String logoUrl;
        private String phone;
        private Branch branch;

        @JsonProperty("company")
        public Builder withCompany(String company){
            this.company = company;
            return this;
        }

        @JsonProperty("logoUrl")
        public Builder withLogoUrl(String logoUrl){
            this.logoUrl = logoUrl;
            return this;
        }

        @JsonProperty("phone")
        public Builder withPhone(String phone){
            this.phone = phone;
            return this;
        }

        @JsonProperty("branch")
        public Builder withBranch(Branch branch) {
            this.branch = branch;
            return this;
        }
        public Content build(){
            return new Content(this);
        }
    }
}
Branch
Model类中,我想删除添加新位置示例的依赖项
charlotte
,并使其通用化。我如何才能做到这一点,这样我就不需要使用
@JsonProperty(“nyc”)
,任何新的位置都将被读取和映射

@JsonDeserialize( builder = Branch.Builder.class)
public class Branch {

    private final Nyc nyc;
    private final Boston boston;

    private Branch(Builder builder){
        this.boston = builder.boston;
        this.nyc = builder.nyc;
    }

    public Nyc getNyc() {
        return nyc;
    }
    public Boston getBoston() {
        return boston;
    }

    @JsonIgnoreProperties( ignoreUnknown = true)
    public static class Builder{
        private Nyc nyc;
        private Boston boston;

        @JsonProperty("nyc")
        public Builder withNyc(Nyc nyc){
            this.nyc = nyc;
            return this;
        }

        @JsonProperty("boston")
        public Builder withBoston(Boston boston){
            this.boston = boston;
            return this;
        }

        public Branch build(){
            return new Branch(this);
        }
    }
}

@JsonDeserialize(builder = Products.Builder.class)
public class Products {

    private final Map<String,String> asian;
    private final Map<String,String> american;

    public Products(Builder builder){
        this.asian = builder.asian;
        this.american = builder.american;
    }

    public Map<String, String> getAsian() {
        return asian;
    }

    public Map<String, String> getAmerican() {
        return american;
    }

    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Builder {
        private Map<String,String> asian;
        private Map<String,String> american;

        @JsonProperty("asian")
        public Builder withAsian(Map<String,String> asian){
            this.asian = asian;
            return this;
        }

        @JsonProperty("american")
        public Builder withAmerican(Map<String,String> american){
            this.american = american;
            return this;
        }

        public Products build(){
           return  new Products(this);
        }
    }
}
主要内容:


Branch类应该定义ArrayList,而不是将每个位置作为单独的属性(nyc、boston等)。通过这种方式,您可以使所有这些变得通用。@Juan我考虑过这种方法,但JSON结构不是一个
列表
,而是对象示例
{“branch”:{“nyc”:{},“boston”:{},“charlotte”:{}}
,因此我提出了这个疑问。是否可以使用
ArrayList
?。你是对的,我以为我已经将其视为一个数组。如果您无法更改json的生成方式,可能您唯一的选择就是使用反射来添加位置属性。@Juan您可以提供一个使用反射解决此问题的示例,或者为我指出正确的资源。我只是在检查,但您似乎只能使用反射来处理现有的字段和方法,没有运气添加新字段。很抱歉
@JsonDeserialize(builder = Boston.Builder.class)
public class Boston {

    private final Products products;

    private Boston(Builder builder){
        this.products = builder.products;
    }

    public Products getProducts() {
        return products;
    }

    @JsonIgnoreProperties( ignoreUnknown = true)
    public static class Builder {
        private Products products;

        @JsonProperty("products")
        public Builder withProducts(Products products){
            this.products = products;
            return this;
        }

        public Boston build(){
            return new Boston(this);
        }
    }
}

@JsonDeserialize(builder = Nyc.Builder.class)
public class Nyc {

    private final Products products;

    private Nyc(Builder builder){
        this.products = builder.products;
    }

    public Products getProducts() {
        return products;
    }


    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Builder{
        private Products products;

        @JsonProperty("products")
        public Builder withProducts(Products products){
            this.products = products;
            return this;
        }

        public Nyc build(){
            return new Nyc(this);
        }
    }
}
public class ReadJSON {
  public static void main(String[] args)
      throws IOException
  {
    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    Content content = mapper.readValue(new File("content.json"), Content.class);
    mapper.writeValue(System.out,content);
  }
}