如何使用URL解析Java文件中的多个JSON对象

如何使用URL解析Java文件中的多个JSON对象,java,json,Java,Json,我在一个文本文件中有多个JSON objectsavailable,我试图从每个JSON objectsavailable中获取数据,以获取一些数据并将其存储在我的数据库中。以下是我掌握的数据样本: {"address":"4565 S Wayside Dr","categories":["Other Textile Goods","Textile Manufacturers"],"city":"Houston","country":"US","dateAdded":"2016-11-17T22

我在一个文本文件中有多个JSON objectsavailable,我试图从每个JSON objectsavailable中获取数据,以获取一些数据并将其存储在我的数据库中。以下是我掌握的数据样本:

{"address":"4565 S Wayside Dr","categories":["Other Textile Goods","Textile Manufacturers"],"city":"Houston","country":"US","dateAdded":"2016-11-17T22:36:43Z","dateUpdated":"2017-09-12T14:29:52Z","keys":["us/tx/houston/4565swaysidedr/-1836686262"],"latitude":"29.6981","longitude":"-95.3212","name":"Radium Textiles LLC","phones":["7136901081"],"postalCode":"77087","province":"TX","sourceURLs":["http://www.citysearch.com/profile/607780624/houston_tx/radium_textiles_llc.html"],"id":"AVwdH8-KkufWRAb52ixf"}
{"address":"6104 Donoho St","categories":["Wholesale Textile Brokers","Textile Brokers"],"city":"Houston","country":"US","dateAdded":"2017-03-26T19:08:42Z","dateUpdated":"2017-03-26T19:08:42Z","imageURLs":["http://images1.citysearch.net/assets/guide/images/logo_citysearch_130x25.gif"],"keys":["us/tx/houston/6104donohost/-214331342"],"latitude":"29.677891","longitude":"-95.324173","name":"T A Textiles","phones":["7136452800"],"postalCode":"77033","province":"TX","sourceURLs":["http://www.superpages.com/bp/houston-tx/t-a-textiles-L2170967950.htm","http://houston.citysearch.com/profile/647921770/houston_tx/t_a_textiles.html"],"id":"AVwdbMI6IN2L1WUfvriy"}
{"address":"4544 S Pinemont Dr","categories":["Other Fabricated Textile Product Manufacturers","Textile Manufacturers","Other Textile Goods"],"city":"Houston","country":"US","dateAdded":"2016-11-17T22:33:12Z","dateUpdated":"2017-09-12T14:29:50Z","keys":["us/tx/houston/4544spinemontdr/-1836686262"],"latitude":"29.8369","longitude":"-95.5160","name":"Radium Textiles LLC","neighborhoods":["Fairbanks/ Northwest Crossing , Northwest Houston"],"phones":["7136901390"],"postalCode":"77041","province":"TX","sourceURLs":["http://www.citysearch.com/profile/694636660/houston_tx/radium_textiles_llc.html","http://www.yellowpages.com/houston-tx/mip/radium-textiles-456243882?lid=456243882"],"websites":["http://api.citygridmedia.com/content/places/v2/click?q=9YKflVKbY9NauPJdMy0B1gS1IhB4xv4EWw0zDoT-UWc_izWF3zs5PKGdfOHubWrvM0QwDCYwbOH2fdLi0dK5xArULcksCCbfR-WWAz9xD1AmGVAQZIom4U3n5R4DuRC8WJCtvJcNItEKoCSfzwapuGnmwGnHDpEGYXGjnN4u8zXqkiimSHFf4_dbqGRbVgNJczcRYGsO7BQjsEDjdlUTJ3CxVQB3K1438yd7WPe-AAAIJEq588kBWNDLbak0Vs-EUxvQmWKBKxWI5ahci9eDn5KNvXpHpqZUL_e0UVacwelpEs92aC0Q2f_N0ZyiviGOHw8dOG3WIXM3rnMIStdm3v06ddF7lICNJl77Z6Y_mtMiylGr2EYGE_lU-dhl6pZnJ92MqQhlZpOjEubWZv1Bd95b8A-INOGKto848V3VdJNGPJwFN_DkdeWGF8YMvDWgew1xs3RSeBeHcBqFzLqQkDbgIllvuxl9VON3HBMwPYjMZ0kqzhi02JRzW0rO_gItNZKuHfHb3rNrWctuJQ2Qvup-kEiLHf5Hya_5KCAgn6uOStAioAXszLKlglJqFMNQE39j6ieFhMg&placement=listing_profile&cs_user=unknown&cs_session=88473fea2af4b100b0e7993b2eafa4bedbe4234c"],"id":"AVwczWsPkufWRAb5zLcG"}
{"address":"7085 Alameda Ave","categories":["Other Textile Goods","Textile Manufacturers","Textile Finishers","Wholesale Textiles"],"city":"El Paso","country":"US","dateAdded":"2017-06-27T05:29:45Z","dateUpdated":"2017-09-06T17:24:47Z","keys":["us/tx/elpaso/7085alamedaave/-266489986"],"latitude":"31.7550","longitude":"-106.3926","name":"Midwest Textile Co","phones":["9158811790"],"postalCode":"79915","province":"TX","sourceURLs":["http://www.citysearch.com/profile/620236204/el_paso_tx/midwest_textile_co.html"],"id":"AVzoBujQLD2H7whiXdiR"}
我试图将其解析如下:

InputStream resourceInputStream =  context.getResourceAsStream("/WEB-INF/jsp/modules/data/20180427-businesses.txt");
            String jsonString = IOUtils.toString(resourceInputStream, "UTF-8");
            JSONObject json = (JSONObject) JSONSerializer.toJSON( jsonString );    
            String address = json.getString("address");
但由于数据不是单个JSON字符串,因此无法正常工作。而且,我拥有的数据不在数组中,这让我更加困难。我还尝试创建一个具有类似变量的Java类,并尝试将JSON字符串直接映射到该类,但它对我也不起作用

InputStream resourceInputStream =  context.getResourceAsStream("/WEB-INF/jsp/modules/data/20180427-businesses.txt");
            String jsonString = IOUtils.toString(resourceInputStream, "UTF-8");
            ObjectMapper mapper = new ObjectMapper();
            BusinessDataImportHB records = mapper.readValue(jsonString, BusinessDataImportHB.class);
其中:

public class BusinessDataImportHB 
{

    private List<BusinessRecord> records;

    public List<BusinessRecord> getRecords() {
        return records;
    }

    public void setRecords(List<BusinessRecord> records) {
        this.records = records;
    }
}
公共类BusinessDataImportHB
{
私人名单记录;
公共列表记录(){
退货记录;
}
公共记录(列表记录){
这个.记录=记录;
}
}

公共类业务记录{
私有字符串地址;
私人名单类别;
私人城市;
私人国家;
已添加私人日期;
私人日期更新;
私有列表密钥;
私有字符串纬度;
私有字符串经度;
私有字符串名称;
私人名单电话;
专用字符串后代码;
私人弦省;
私人名单网站;
私有字符串id;

我无法更改数据的格式。我可以使用什么样的最佳方法来解析数据并获取单个记录?

如果每个JSON对象都在一行中,您可以逐行读取文件

try (Stream<String> stream = Files.lines(Paths.get("..."))) {
    stream.forEach(line -> {
        JSONObject json = (JSONObject) JSONSerializer.toJSON(line);    
        String address = json.getString("address");
    });
}
try(Stream=Files.line(path.get(“…”)){
stream.forEach(行->{
JSONObject json=(JSONObject)JSONSerializer.toJSON(行);
字符串地址=json.getString(“地址”);
});
}

如果每个JSON对象都在一行中,则可以逐行读取文件

try (Stream<String> stream = Files.lines(Paths.get("..."))) {
    stream.forEach(line -> {
        JSONObject json = (JSONObject) JSONSerializer.toJSON(line);    
        String address = json.getString("address");
    });
}
try(Stream=Files.line(path.get(“…”)){
stream.forEach(行->{
JSONObject json=(JSONObject)JSONSerializer.toJSON(行);
字符串地址=json.getString(“地址”);
});
}

< /代码> 如果您的记录是逐行的,并且您有一个大文件,您可能需要逐行考虑读取和解析。可以使用“尝试”与“资源块”来确保未关闭的资源没有内存泄漏。

String pathname = "/home/william/test.txt"; // your file
try (Scanner sc = new Scanner(new FileInputStream(new File(pathname)))) {
    while (sc.hasNextLine()) {
        JSONObject json = (JSONObject) JSONSerializer.toJSON(sc.nextLine());
        // TODO do something with it
    }
} catch (Exception e) {
    // TODO
}

如果你的记录是按一行一行的,你有一个大的文件,你可能会考虑逐行地阅读和解析。你可以使用一个尝试与资源块,以确保没有来自未关闭资源的内存泄漏。

String pathname = "/home/william/test.txt"; // your file
try (Scanner sc = new Scanner(new FileInputStream(new File(pathname)))) {
    while (sc.hasNextLine()) {
        JSONObject json = (JSONObject) JSONSerializer.toJSON(sc.nextLine());
        // TODO do something with it
    }
} catch (Exception e) {
    // TODO
}

当您将数据更改为文本文件中json对象的数组时会出现什么问题?我想这很容易解析。看起来每行有一个对象。您可以读取每行并将其视为json对象。要反序列化它,您可以使用Gson。按照@Juan所说的,或者您可以更正文本文件以包含jsonArray@Scary袋熊将数据封装在[]中,将其转换为文本文件中的数组,但出现以下错误:应为BEGIN_数组,但在第1行列中为BEGIN_对象2@Juan,如果我有文件URL而不是文件路径,并且有多个文件,并且我正在尝试读取从URL获得的每一行数据,那么我如何读取数据。是否有我可以参考的示例?此外,这可能不是每一行,data是JSON对象的集合当您将数据更改为文本文件中JSON对象的数组时会出现什么问题?我想这很容易解析。看起来每行有一个对象。您可以读取每行并将其视为JSON对象。要反序列化它,您可以使用Gson。按照@Juan所说的,或者您可以更正文本文件以包含JSONArray@ScaryWombat,我试图通过将数据封装在[]中,将其转换为文本文件中的数组,但出现以下错误:应为BEGIN_数组,但在第1行列中为BEGIN_对象2@Juan,如果我有文件URL而不是文件路径,并且有多个文件,并且我正在尝试读取从URL获得的每一行数据,那么我如何读取数据。是否有我可以参考的示例?此外,这可能不是每一行,data是JSON对象的集合