当前位置: 首页 > 知识库问答 >
问题:

如何为不同的 JSON 创建一个通用 jsondatareader 类

郎思远
2023-03-14

我已经创建了客户json文件,如下所示:

[{"firstName":"test","lastName":"temp","age": 35,"emailAddress":"test@Gmail.com","Address":{"Street Address":"test test","city":"city","postCode":"12343546","state":"state","Country":"cy","County":"abc"},"phoneNumber":{"home":"012345678","mob":"0987654321" } }, { "firstName":"tug","lastName":"kjk","age": 35,"emailAddress":"jhgj@Gmail.com","Address":{"Street Address":"jh hjgjhg,"city":"kjhjh","postCode":"122345","state":"jhgl","Country":"jaj","County":"jhgkg"},"phoneNumber":{"home":"012345678","mob":"0987654321" } } ]

对于客户 JSON 数据文件,我创建了以下 JSON 数据读取器类:

public class JsonDataReader {
    private final String customerFilePath = new ConfigFileReader().getTestDataResourcePath() + "Customer.json";
    private List<Customer> customerList;

    public JsonDataReader(){
        customerList = getCustomerData();
    }

    private List<Customer> getCustomerData() {
        Gson gson = new Gson();
        BufferedReader bufferReader = null;
        try {
            bufferReader = new BufferedReader(new FileReader(customerFilePath));
            Customer[] customers = gson.fromJson(bufferReader, Customer[].class);
            return Arrays.asList(customers);
        }catch(FileNotFoundException e) {
            throw new RuntimeException("Json file not found at path : " + customerFilePath);
        }finally {
            try { if(bufferReader != null) bufferReader.close();}
            catch (IOException ignore) {}
        }
    }

    public final Customer getCustomerByName(String customerName){
        for(Customer customer : customerList) {
            if(customer.firstName.equalsIgnoreCase(customerName)) return customer;
        }
        return null;
    }


}

创建的POJO类如下:

public class Customer {
        public String firstName;
        public String lastName;
        public int age;
        public String emailAddress;
        public Address address;
        public PhoneNumber phoneNumber;

        public class Address {
            public String streetAddress;
            public String city;
            public String postCode;
            public String state;
            public String country;
            public String county;
        }

        public class PhoneNumber {
            public String home;
            public String mob;
        }

}

到目前为止,只有一个JSON数据文件,这很好,但是我将创建更多的JSON数据文件,所以可能我必须为每个文件创建多个POJOs,但是有什么方法可以为所有这些JSON文件编写通用的jsondatareader类呢?

共有2个答案

阴靖
2023-03-14

如果是这样的话,为什么不把JSON转换成Map而不是POJO呢!如果你走POJO路线,那么你将在你的代码基础中大量使用Jackson或GSon,添加一堆实用方法来迭代每个结果JSonArray或JSonelements。

朱经武
2023-03-14

类(或Object)是定义良好的实体。定义良好的意思是,它的结构在编译时是已知的,并且在编译后不能更改。

必须创建多个类来表示多个JSON文档是很好的。因此,如果您担心要创建的文件数量,这不是问题。

但是,如果 JSON 文档结构将随着每个请求而不断变化,那么定义一系列类就没有意义了。要处理完全动态的 JSON,您应该坚持使用 Gson 为您提供的内容。这就是 Json 元素及其子类。

JsonElement
  > JsonArray
  > JsonObject
  > JsonPrimitive
  > JsonNull

这就是描述JSON对象所需的全部内容。

 类似资料:
  • 假设我在pom.xml文件中放入了以下插件: 然后运行“mvn clean install”。Maven在目标库中创建了两个jar文件。第一个jar文件编译源文件,第二个jar编译测试文件。这两个jar将具有相同的工件名称。 如果我想在另一个项目中使用源代码的jar作为依赖项,我可以在另一个项目中放入以下依赖项: 到目前为止还不错。 如果我还想为测试文件添加依赖项,就会出现问题。在本例中,我将有两

  • 我有玩家类和敌人类,它们都已经扩展了一个游戏类(libgdx)。现在我可以看到玩家和敌人类共享很多公共代码,我可以做一个抽象并将所有必要的代码放在那里,但是玩家类已经从游戏扩展到了敌人类。 玩家和敌人的职业都有其他职业也会调用的方法。 球员级别 敌方阶级 有没有办法让我把这些方法存储在一个类中,然后在这个类中再次重用它们?

  • 不过就是创建结构体的时候,根据每个对象的特征赋值不同的属性罢了 // 3.创建一个结构体变量 p1 := Person{"lnj", 33} per.say() p2 := Person{"zs", 18} per.Say()

  • null 最终产品应该如下所示: 在上面的例子中,@public instance将只有uniqueKey、gtin、printedGtin作为属性。

  • 显然,在示例中,我将它们设置为字符串属性,但实际上它们是其他类型的。 注意:Object1和Object2实际上是从SOAP服务器所需的XML模型生成的类。所以我不能修改它们。 在我的代码中,我必须访问Object1或Object2的'name'属性,这取决于不同的因素。这个点是一个事件处理程序,所以在某一时刻,它捕获一个用Object1调用的事件,而在其他时间,它捕获一个用Object2调用的事

  • 我试图为一个包含不同类型对象数组的对象定义一个swagger模式定义。 下面是模板对象(以及所有相关对象类型)的 json 架构。我知道 swagger 不支持 oneOf 谓词,所以我只是想弄清楚如何在 swagger 中描述这个数据结构。我已经尝试了这种语法的许多变体,但没有一个有效,这是我根据规范和这里找到的一些例子所能达到的最接近的:http://json-schema.org/examp