Нужно решить задачу, условие которой звучит так:
На входе имеется файл в формате json, содержащий информацию о каком-то количестве организаций, в т.ч. названия, адреса, номера телефонов, ИНН, ОГРН, а также о ценных бумагах, которыми владеет каждая компания. Необходимо сформировать на основе исходного файла коллекцию объектов без потери информации, где каждый объект представляет одну организацию. Для сформированной коллекции:
Для решения задачи я создал Maven проект и подключил либу Gson и создал 4 класса Main, Security, Company, LocalDateAdapter.
Реализовал код, который получает массив ценных бумаг, массив компаний из Json файла и создает массив объектов компаний с параметрами и массивом принадлежащих ей ценных бумаг. Вроде бы на вид выглядит правильно. С первым пунктом вроде бы нет проблем, разве что если есть способ вывести название-дата основания с помощью .stream(). Но вот как программно реализовать остальные пункты задачи до меня не доходит. Кто сможет понять, прошу помочь разобраться.
Main.java
package com.json;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws Exception {
File file = new File("Company.json");
BufferedReader brOur = new BufferedReader(new FileReader(file));
String stOur = brOur.readLine();
String jsonFile = "";
while (stOur != null) {
jsonFile += stOur;
stOur = brOur.readLine();
}
Gson gson = new GsonBuilder().registerTypeAdapter(LocalDate.class, new LocalDateAdapter()).create();
Type compListType = new TypeToken<ArrayList<Company>>(){}.getType();
ArrayList<Company> companies = gson.fromJson(jsonFile, compListType);
for (Company company: companies) {
System.out.println("\"" + company.name + "\" - \"" + company.date_Osnovania + "\"");
}
}
}
Security.java
package com.json;
import java.time.LocalDate;
public class Security {
int id;
String code;
String name_bum;
LocalDate date_start;
LocalDate date_end;
String currency;
public int getId() {
return id;
}
public String getCode() {
return code;
}
public String getName_bum() {
return name_bum;
}
public LocalDate getDate_start() {
return date_start;
}
public LocalDate getDate_end() {
return date_end;
}
public String getCurrency() {
return currency;
}
@Override
public String toString(){
return "[id=\"" + id + "\", code=\"" + code + "\", name_bum=\""
+ name_bum + "\", date_start=\"" + date_start + "\", date_end=\"" + date_end + "\", currency=\"" + currency + "\"]";
}
}
Company.java
package com.json;
import java.time.LocalDate;
import java.util.ArrayList;
public class Company {
String name;
String address;
String telNumber;
String inn;
String ogrn;
LocalDate date_Osnovania;
ArrayList<Security> securities;
public ArrayList<Security> getFilterSecurities(){
LocalDate today = LocalDate.now();
securities.stream()
.filter(s->s.date_end.isBefore(today));
return securities;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public String getTelNumber() {
return telNumber;
}
public String getInn() {
return inn;
}
public String getOgrn() {
return ogrn;
}
public LocalDate getDate_Osnovania() {
return date_Osnovania;
}
public ArrayList<Security> getSecurities() {
return securities;
}
@Override
public String toString(){
return "[name=\"" + name + "\", address=\"" + address + "\", telNumber=\""
+ telNumber + "\", inn=\"" + inn + "\", ogrn=\"" + ogrn
+ "\", date_Osnovania=\"" + date_Osnovania + "\", securities=\"" + securities + "\"]";
}
}
Ну и код для LocalDateAdapter.java он нужен для парсинга в LocalDate
package com.json;
import java.io.IOException;
import java.time.LocalDate;
import com.google.gson.*;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
class LocalDateAdapter extends TypeAdapter<LocalDate> {
@Override
public void write(final JsonWriter jsonWriter, final LocalDate localDate) throws IOException {
if (localDate == null) {
jsonWriter.nullValue();
} else {
jsonWriter.value(localDate.toString());
}
}
@Override
public LocalDate read(final JsonReader jsonReader) throws IOException {
if (jsonReader.peek() == JsonToken.NULL) {
jsonReader.nextNull();
return null;
} else {
return LocalDate.parse(jsonReader.nextString());
}
}
}
А также Json файлы:
Company.json
[
{
"name": "ЗАО Свербанк",
"address": "г. Москва, ул. Филатова, 5А",
"telNumber": "74952285651",
"inn": "7704407589",
"ogrn": "1177746415857",
"date_Osnovania": "1908-05-27",
"securities": [{ "id": 21,
"code": "SBR",
"name_bum": "Акции Свербанка",
"date_start": "1993-05-28",
"date_end": "2013-05-27",
"currency": "RUB"},
{ "id": 76,
"code": "BRS",
"name_bum": "Акции Brazil Company",
"date_start": "1953-05-27",
"date_end": "2023-05-28",
"currency": "USD"},
{ "id": 11,
"code": "VKR",
"name_bum": "Акции Газшпрота",
"date_start": "1995-10-01",
"date_end": "2018-05-10",
"currency": "RUB"}]
},
{
"name": "ООО Макдоладс",
"address": "USA, NY, st. Wallstreet, 21",
"telNumber": "05321153113",
"inn": "6523485125",
"ogrn": "6512545658759",
"date_Osnovania": "1948-07-06",
"securities": [{ "id": 54,
"code": "GYT",
"name_bum": "акции Gym Center Traning",
"date_start": "2009-11-15",
"date_end": "2029-11-15",
"currency": "USD"},
{ "id": 45,
"code": "GT",
"name_bum": "акции General Totors",
"date_start": "1899-01-15",
"date_end": "2009-05-05",
"currency": "USD"},
{ "id": 95,
"code": "GGM",
"name_bum": "акции Germany Glock Migrante",
"date_start": "2009-11-03",
"date_end": "2049-11-15",
"currency": "EUR"}]
},
{
"name": "ВТБ банк",
"address": "г. Москва, Калужское шоссе, 35",
"telNumber": "74952651362",
"inn": "7514745125",
"ogrn": "7541454523547",
"date_Osnovania": "1983-02-01",
"securities": [{ "id": 59,
"code": "DDF",
"name_bum": "Акции компании Дельта",
"date_start": "1956-03-02",
"date_end": "2006-05-31",
"currency": "RUB"},
{ "id": 95,
"code": "PUY",
"name_bum": "Акции компании PumaC",
"date_start": "1996-03-02",
"date_end": "2036-05-31",
"currency": "EUR"}]
},
{
"name": "ООО Яндекс",
"address": "г. Москва, ул. Ленина, 85А",
"telNumber": "74955652635",
"inn": "7541451221",
"ogrn": "7855723651545",
"date_Osnovania": "1999-05-31",
"securities": [{ "id": 23,
"code": "YND",
"name_bum": "Акции компании Яндекс",
"date_start": "2000-05-25",
"date_end": "2015-05-25",
"currency": "RUB"},
{ "id": 22,
"code": "AVT",
"name_bum": "Акции компании AutoVaz",
"date_start": "1985-05-25",
"date_end": "2013-05-25",
"currency": "RUB"},
{ "id": 17,
"code": "GMC",
"name_bum": "Акции компании ГватемалЦентр",
"date_start": "2015-05-25",
"date_end": "2040-05-25",
"currency": "RUB"}]
}
]
Security.java
[{ "id": 21,
"code": "SBR",
"name_bum": "Акции Свербанка",
"date_start": "1993-05-28",
"date_end": "2013-05-27",
"currency": "RUB"
},
{ "id": 76,
"code": "BRS",
"name_bum": "Акции Brazil Company",
"date_start": "1953-05-27",
"date_end": "2023-05-28",
"currency": "USD"
},
{ "id": 11,
"code": "VKR",
"name_bum": "Акции Газшпрота",
"date_start": "1995-10-01",
"date_end": "2018-05-10",
"currency": "RUB"
},
{ "id": 54,
"code": "GYT",
"name_bum": "акции Gym Center Traning",
"date_start": "2009-11-15",
"date_end": "2029-11-15",
"currency": "USD"
},
{ "id": 45,
"code": "GT",
"name_bum": "акции General Totors",
"date_start": "1899-01-15",
"date_end": "2009-15-05",
"currency": "USD"
},
{ "id": 95,
"code": "GGM",
"name_bum": "акции Germany Glock Migrante",
"date_start": "2009-11-03",
"date_end": "2049-11-15",
"currency": "EUR"
},
{ "id": 59,
"code": "DDF",
"name_bum": "Акции компании Дельта",
"date_start": "1956-03-02",
"date_end": "2006-05-31",
"currency": "RUB"
},
{ "id": 95,
"code": "PUY",
"name_bum": "Акции компании PumaC",
"date_start": "1996-03-02",
"date_end": "2036-05-31",
"currency": "EUR"
},
{ "id": 23,
"code": "YND",
"name_bum": "Акции компании Яндекс",
"date_start": "2000-05-25",
"date_end": "2015-05-25",
"currency": "RUB"
},
{ "id": 22,
"code": "AVT",
"name_bum": "Акции компании AutoVaz",
"date_start": "1985-05-25",
"date_end": "2013-05-25",
"currency": "RUB"
},
{ "id": 17,
"code": "GMC",
"name_bum": "Акции компании ГватемалЦентр",
"date_start": "2015-05-25",
"date_end": "2040-05-25",
"currency": "RUB"
}]
import com.google.gson.annotations.SerializedName;
import java.time.LocalDate;
import java.util.List;
import lombok.Data;
@Data
public class Company {
@SerializedName("name")
private String name;
@SerializedName("address")
private String address;
@SerializedName("telNumber")
private String telNumber;
@SerializedName("inn")
private String inn;
@SerializedName("ogrn")
private String ogrn;
@SerializedName("date_Osnovania")
private LocalDate foundationDate;
@SerializedName("securities")
private List<Security> securities;
@Override
public String toString() {
return "[name=\"" + name + "\", address=\"" + address + "\", telNumber=\""
+ telNumber + "\", inn=\"" + inn + "\", ogrn=\"" + ogrn
+ "\", date_Osnovania=\"" + foundationDate + "\", securities=\"" + securities + "\"]";
}
}
import lombok.Data;
import java.time.LocalDate;
import com.google.gson.annotations.SerializedName;
@Data
public class Security {
@SerializedName("id")
private Integer id;
@SerializedName("code")
private String code;
@SerializedName("name_bum")
private String nameBum;
@SerializedName("date_start")
private LocalDate dateStart;
@SerializedName("date_end")
private LocalDate dateEnd;
@SerializedName("currency")
private String currency;
@Override
public String toString() {
return "[id=\"" + id + "\", code=\"" + code + "\", name_bum=\""
+ nameBum + "\", date_start=\"" + dateStart + "\", date_end=\"" + dateEnd + "\", currency=\"" + currency + "\"]";
}
}
import com.google.gson.TypeAdapter;
import java.io.IOException;
import java.time.LocalDate;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
class LocalDateAdapter extends TypeAdapter<LocalDate> {
@Override
public void write(final JsonWriter jsonWriter, final LocalDate localDate) throws IOException {
if (localDate == null) jsonWriter.nullValue();
else jsonWriter.value(localDate.toString());
}
@Override
public LocalDate read(final JsonReader jsonReader) throws IOException {
if (jsonReader.peek() == JsonToken.NULL) {
jsonReader.nextNull();
return null;
}
else return LocalDate.parse(jsonReader.nextString());
}
}
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonReader;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.time.LocalDate;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) throws IOException {
try (JsonReader reader = new JsonReader(new BufferedReader(new InputStreamReader(new FileInputStream("Company.json"), "UTF-8")))) {
Gson gson = new GsonBuilder().registerTypeAdapter(LocalDate.class, new LocalDateAdapter()).create();
Company[] companies = gson.fromJson(reader, Company[].class);
Stream.of(companies).forEach(company ->
System.out.println(String.join("", "'", company.getName(), "' - '", company.getFoundationDate().toString(), "'"))
);
System.out.println("*********************************************");
List<Security> securities = getFilteringSecurities(companies, s->s.getDateEnd().isBefore(LocalDate.now()));
System.out.println(securities.size());
securities.forEach(System.out::println);
System.out.println("*********************************************");
LocalDate foundationDate = LocalDate.now().minusYears(50);//user input
List<Company> companiesByFoundationDate = getFilteringCompanies(companies, c->c.getFoundationDate().isAfter(foundationDate));
companiesByFoundationDate.forEach(System.out::println);
}
}
private static List<Security> getFilteringSecurities(Company[] companies, Predicate <Security> predicate) {
return Stream.of(companies)
.flatMap(c -> c.getSecurities().stream())
.filter(predicate)
.collect(Collectors.toList());
}
private static List<Company> getFilteringCompanies(Company[] companies, Predicate <Company> predicate) {
return Stream.of(companies)
.filter(predicate)
.collect(Collectors.toList());
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Почему-то SwitchButton-ы в item-ах в recyclerView работают некорректноПри переключении - иногда переключается не только тот, который переключаю, но и еще...
Есть BottomNavigationView и 3 Fragment'аФрагмент "Home" содержит ScrollView
Есть некоторая коллекция(исходник: Проблема с удалением переменных классов потомков):
Помогите реализовать задачу, иметься таблица в базе данных