Как читать несколько файлов JSON и записывать их в один файл JSON, используя Java - PullRequest
0 голосов
/ 29 августа 2018

У меня есть несколько файлов JSON, как показано ниже, и я хочу объединить файлы и сохранить данные из них в новый отдельный файл json, как указано ниже:

JSON1:

{
    "jobRunID" : "1940",
    "mappingResult": [

        {
            "studyID": "ca209-030",
            "fileName": "aesae.csv",
            "ref2FilePath": "C://stage/pra/cro/ca/209/030/ref2/aesae.csv",
            "columnName": "ae_start_dt",
            "currentMapping": "ae_start_dt,ae_st_dt",
            "isMapped": "N",
            "timeStamp": "20180827093033"
        },
        {
            "studyID": "ca209-004",
            "fileName": "labressae.csv",
            "ref2FilePath": "C://stage/pra/cro/ca/209/030/ref2/labressae.csv",
            "columnName": "ae_verbatim",
            "currentMapping": "ae_vtm,ae_vt",
            "isMapped": "N",
            "timeStamp": "20180827093033"
        }

    ]
}

JSON2:

{
    "jobRunID" : "1940",
    "mappingResult": [

        {
            "studyID": "ca209-030",
            "fileName": "aesae.csv",
            "ref2FilePath": "C://stage/pra/cro/ca/209/030/ref2/aesae.csv",
            "columnName": "ae_start_dt",
            "currentMapping": "ae_start_dt,ae_st_dt",
            "isMapped": "N",
            "timeStamp": "20180827093033"
        },
        {
            "studyID": "ca209-004",
            "fileName": "labressae.csv",
            "ref2FilePath": "C://stage/pra/cro/ca/209/030/ref2/labressae.csv",
            "columnName": "ae_verbatim",
            "currentMapping": "ae_vtm,ae_vt",
            "isMapped": "N",
            "timeStamp": "20180827093033"
        }

    ]
}

Ожидаемая O / P:

{
  "jobRunID": "1940",
  "mappingResult": [
    {
      "studyID": "ca209-030",
      "fileName": "aesae.csv",
      "ref2FilePath": "C://stage/pra/cro/ca/209/030/ref2/aesae.csv",
      "columnName": "ae_start_dt",
      "currentMapping": "ae_start_dt,ae_st_dt",
      "isMapped": "N",
      "timeStamp": "20180827093033"
    },
    {
      "studyID": "ca209-004",
      "fileName": "labressae.csv",
      "ref2FilePath": "C://stage/pra/cro/ca/209/030/ref2/labressae.csv",
      "columnName": "ae_verbatim",
      "currentMapping": "ae_vtm,ae_vt",
      "isMapped": "N",
      "timeStamp": "20180827093033"
    },
    {
      "studyID": "ca209-030",
      "fileName": "aesae.csv",
      "ref2FilePath": "C://stage/pra/cro/ca/209/030/ref2/aesae.csv",
      "columnName": "ae_start_dt",
      "currentMapping": "ae_start_dt,ae_st_dt",
      "isMapped": "N",
      "timeStamp": "20180827093033"
    },
    {
      "studyID": "ca209-004",
      "fileName": "labressae.csv",
      "ref2FilePath": "C://stage/pra/cro/ca/209/030/ref2/labressae.csv",
      "columnName": "ae_verbatim",
      "currentMapping": "ae_vtm,ae_vt",
      "isMapped": "N",
      "timeStamp": "20180827093033"
    }
  ]
}

Любая помощь будет оценена, так как я новичок в обработке файлов JSON в JAVA. Согласно приведенным выше JOSN для всех идентичных JobID, я хочу объединить mappingResult из обоих файлов в один файл o / p, как описано выше в ожидаемом o / p.

Я пытаюсь использовать Java, используя приведенный ниже код, но он хорошо читается для 2 входных файлов, но не уверен, как использовать di для нескольких файлов json:

public class MergeJSON {
    @JsonMerge
    List<Integer> contacts;

    public List<Integer> getContacts() {
        return contacts;
    }

    public void setContacts(List<Integer> contacts) {
        this.contacts = contacts;
    }

    @Override
    public String toString() {
        return contacts.toString();
    }
    public static void main(String[] args) throws JsonProcessingException, IOException {
        TypeReference<Map<String, MergeJSON>> type = new TypeReference<Map<String, MergeJSON>>() {};
        InputStream input = new ClassPathResource("C:\\Users\\sweta.h.sharma\\Test.json").getInputStream();
        InputStream input2 = new ClassPathResource("C:\\Users\\sweta.h.sharma\\Test1.json").getInputStream();
        ObjectMapper mapper = new ObjectMapper();
        Object contacts = mapper.readValue(input, type);
        mapper.reader(type)
                .withValueToUpdate(contacts)
                .readValues(input2);

            System.out.println(contacts);

}
}

1 Ответ

0 голосов
/ 29 августа 2018

Используйте Jackson Api.
Создайте класс Pojo так же, как ваш объект json (класс должен иметь такие элементы, как 'jobRunID', 'mappingResult').

//class JsonObj with getters & setters 
String jobRunID;
List<Mappingresult> mappingResult;  // Mappingresult is again POJO class with members like studyID,fileName etc

Это классы, которые вы должны использовать

com.fasterxml.jackson.core.JsonFactory;
com.fasterxml.jackson.core.JsonParser;
com.fasterxml.jackson.databind.ObjectMapper;

и код.

ObjectMapper objMapper=new ObjectMapper();
JsonFactory jfactory = new JsonFactory();
JsonParser jParser1=jfactory.createJsonParser(jsonString1); //json String 1
JsonParser jParser2=jfactory.createJsonParser(jsonString2); //json String 2

JsonObj obj1=objMapper.readValue(jParser1,JsonObj.class);// JsonObj is Pojo for your jsonObject
JsonObj obj2=objMapper.readValue(jParser2,JsonObj.class);

obj1 и obj2 будут иметь список mappingResult в качестве списка. Вы можете объединить этот список в один список, а затем записать его в файл или распечатать на консоли

РЕДАКТИРОВАТЬ:

Чтобы вернуть результат как String, вы можете использовать ObjectMapper :: writeValueAsString

obj1.getMappingResult().putAll(obj2.getMappingResult());
String jsonString = objMapper.writeValueAsString(obj1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...