Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
1

Java JSON Parser

29.06.2019, 00:12. Показов 2315. Ответов 7

Author24 — интернет-сервис помощи студентам
Всем привет, я мало знаком с работой и преобразованием JSON, и буду признателен если подскажете, исправите код, короче заполните пробелы знаний.
Я начал знакомится с Gson и Jackson, и немного запутался, потому очень надеюсь что XML парсинги мало востребованы и мне еще е его/их не придется осваивать(по крайней мере для начала). Jackson один пример я уже краем глаза просматривал пол года назад, там было с аннотацией над полями сущности, а значит я не понимал механизм и + это было в ущерб универсальности (могут попастся POJO/сущности извне). XML пока откину (читал что он вроде медленный). Итак Gson или Jackson, что лучше, в чем отличия?
На счет JSON, насколько я понял, это файл хранящий конкретную инстанс, и то что он у меня всего невсего строчка, например
JSON
1
{"firstName":"Ja","lastName":"My Second name","age":100,"salary":110000,"skills":["Database","Web Flow","RestFull Reactive"]}
и выглядит он не так красиво как в примерах, многострочно и с табуляцией это нормально?! Это просто файл с одной строчкой?
Я начал с Gson, и он мне пока больше понравился. Насколько я понял, то и там и там не маленькая библиотека (типа деревьев и нодов), но главные инструменты это преобразование 3-х типов : Строка, Объект, и Json файл.
Gson гнавное что делает это преобразовывает строку в объект(и наоборот), и это строка похожа на json формат а не на toString(), а дальше мы уже сами руками записываем ее в нужный файл (у меня мало опыта работы с файлами, возможно неоптимизировано, поправте если что).
А вот Jackson работает иначе (его конвертер я полностью не доделал) он преобзовывает объект в json формат, и как аргумент принимает класс. А еще он как-то сложно преобразовывает json формат в строку (через Object) так что приходится работать с toString(), вот по этому считаю пока что он хуже.
Но, что интересно, над той же самой сущностью что и Gson, Jackson дает другой результат json формата, появляется новый параметр, что для меня очень странно
JSON
1
{"firstName":"Jackson","lastName":"My SureName","age":100,"salary":1250000,"skills":["Database","J2EE Programming","Restfull"],"params":{"skills":"[Database, J2EE Programming, Restfull]","firstName":"Jackson","lastName":"My SureName","salary":"1250000","age":"100"}}
Видимо Gson работает по полям а Jackson учитывает и некоторые методы (как, зачем, почему?), Вот сам класс
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package jacksonandgsondemo;
 
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class Employe{
    private String firstName;
    private String lastName;
    private int age;
    private BigDecimal salary;
    private List<String> skills;
    
    public Employe(){    }
    
    public Map<String, String> getParams() {
        Map<String, String> map = new HashMap<>();
        map.put("firstName",firstName);
        map.put("lastName",lastName);
        map.put("age",Integer.toString(age));
        map.put("salary",salary.toString());
        map.put("skills",skills.toString());
        return map;
    }
    public BigDecimal getSalary(){return salary;}
 
    public void setSalary(BigDecimal salary){this.salary=salary;}
 
    public String getFirstName(){return firstName;}
 
    public void setFirstName(String firstName){this.firstName=firstName;}
 
    public String getLastName(){return lastName;}
 
    public void setLastName(String lastName){this.lastName=lastName;}
 
    public int getAge(){return age;}
 
    public void setAge(int age){this.age=age;}
 
    public List<String> getSkills(){return skills;}
 
    public void setSkills(List<String> skills){this.skills=skills;}
 
    @Override
    public String toString(){
        return "Employe{"+"firstName="+firstName+", lastName="+lastName+", age="+age+", salary="+salary+", skills="+skills+'}';
    }
}

Вот сами конверторы, и спасибо за правильное направление и разъяснения что, как, почему, применяется и проч.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package jacksonandgsondemo;
 
import com.google.gson.Gson;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
public class GsonConvert{
    private static final String fileOut = "src/main/resources/Employee.json";
    private static Gson gson = new Gson();
    public static String objToJson(Employe emp) {
        String serEmployee = gson.toJson(emp);
        try (FileWriter writer = new FileWriter(new File(fileOut));){
            writer.write(serEmployee);
        } catch(IOException e) {
            System.out.println("ERROR : "+e+"\n in write file : "+fileOut);
        }
        return serEmployee;
    }
    public static Employe strToObj(String str) {
        return gson.fromJson(str,Employe.class);
    }
    public static String jsonToStr(String source) {
        String str;
        try(Stream<String> lines = Files.lines(Paths.get(source));) {
            str = lines.collect(Collectors.joining());
        } catch (IOException e) {
            System.out.println("Error, can't read souces "+source+", \n "+e);
            str ="";
        }
        return str;
    }
    public static Employe jsonToObj(String source) {
        return strToObj(jsonToStr(source));
    }
    public static String strToJson(String str) {
        return objToJson(strToObj(str));
    }
    public static String getDefaultSource() {return fileOut;}
}

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package jacksonandgsondemo;
 
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
 
public class JacksonConverter{
    private static final String fileOut = "src/main/resources/Employee.json";
    private static ObjectMapper mapper = new ObjectMapper();
    public static void objToJson(Employe emp) {
        try {
            mapper.writeValue(new File(fileOut),emp);
        } catch(IOException e) {
            System.out.println("Error : can't open file "+fileOut+"\n "+e);
        }
    }
    public static Employe jsonToObj(String source) {
        Employe emp;
        try {
            emp = mapper.readValue(new File(fileOut),Employe.class);
        } catch(IOException e) {
            System.out.println("Error : can't open file "+fileOut+"\n "+e);
            emp = new Employe();
        }
        return emp;
    }
    public static String jsonToString(String source) {
        return jsonToObj(source).toString();
    }
    public static String getDefaultSource() {return fileOut;}
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2019, 00:12
Ответы с готовыми решениями:

Парсинг JSON в JSON Linked Data с использованием Hydra Java
Есть веб страница, на которой пользователь заполняет поля, жмет на кнопку и затем данные...

Json parser
В общем проблема вот в чём получаю json страницу а как получить данные не получается. ...

JSON Parser IllegalStateException
package recordingBook.ExtendedIO.IE; import com.google.gson.stream.JsonReader; import...

Java, JSON и JSON Simple. Непонятка с созданием объекта JSON на сервере для отправки на фронт
Здравствуйте. Разрабатываю интернет-магазин на Java. Мне нужно на фронте получить список товаров из...

7
korvin_
29.06.2019, 00:57
  #2

Не по теме:

Любишь овсянку? Или манку?

0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
29.06.2019, 08:28  [ТС] 3
korvin_, То есть по сути функции у них одинаковые, а в реальных проектах никто не заморачиапется - бери что нравится, и в 99% случаев преобразовываем между строкой, объектом, json-фалом (функционала больше не используем)? на XML можно забить а json никто в редакторе не открывает, так что если там только одна гигантская накрасиво-выглядящая строка никого это не волнует?
Если все так как выше я предположил, то эта тема хорошо для меня складывается, основы знаю, код хоть и не идеальный но рабочий, сохраню его на будущее (из-за неприменения чего-то, я это быстро забываю)?!
0
Эксперт функциональных языков программированияЭксперт Java
4539 / 2732 / 486
Регистрация: 28.04.2012
Сообщений: 8,630
29.06.2019, 12:00 4
Цитата Сообщение от ViktorFX Посмотреть сообщение
То есть по сути функции у них одинаковые, а в реальных проектах никто не заморачиапется - бери что нравится, и в 99% случаев преобразовываем между строкой, объектом, json-фалом (функционала больше не используем)?
Ну, по большому счёту да, но я вопрос задал к тому, что что за каша у тебя в коде?

Добавлено через 45 секунд
Цитата Сообщение от ViktorFX Посмотреть сообщение
сохраню его на будущее
Лучше удали его на будущее.
1
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
29.06.2019, 13:13  [ТС] 5
Цитата Сообщение от korvin_ Посмотреть сообщение
Ну, по большому счёту да, но я вопрос задал к тому, что что за каша у тебя в коде?
Касательно GsonConvert "На безрыбъе и рак рыба" а на остальное я вообще забиваю, важным для меня получается только Gson. Находил примеры либо слишком упрощенные, либо на что-то заточеные.
Но мне кажется что код логичен и интиитивно понятен. Есть 3 "формата" строка, объект, и json-файл - соответственно должно быть 6 преобзарований (объект -> строка, не рассматриваю, он всегда есть, значит осталось 5), названия тоже не стал давать с "from", оставил только "to" чтобы не запутаться, + оставил возможность как записывать в новый json-файл так и "перезаписывать" в файл что есть по умолчанию. Мне кажется что это может быть полезно.
Ну если вы или кто ни будь другой поможет/подскажет с кодом, то ясное дело я его удалю, а так это лучшее из имеющегося.
0
Эксперт функциональных языков программированияЭксперт Java
4539 / 2732 / 486
Регистрация: 28.04.2012
Сообщений: 8,630
29.06.2019, 13:59 6
Цитата Сообщение от ViktorFX Посмотреть сообщение
Но мне кажется что код логичен и интиитивно понятен.
Нет.

Цитата Сообщение от ViktorFX Посмотреть сообщение
Есть 3 "формата" строка, объект, и json-файл
Нет такого формата «JSON-файл».

Цитата Сообщение от ViktorFX Посмотреть сообщение
соответственно должно быть 6 преобзарований
Нет. Чтение/запись файлов тут вообще ортогональна и не к месту. Ты же смешал всё в адовую кучу.
0
Эксперт функциональных языков программированияЭксперт Java
4539 / 2732 / 486
Регистрация: 28.04.2012
Сообщений: 8,630
29.06.2019, 21:04 7
Лучший ответ Сообщение было отмечено ViktorFX как решение

Решение

Ну например…

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package victorfx;
 
import victorfx.model.*;
import victorfx.serializers.Format;
 
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
 
final class Demo {
 
    private static final Path DEMO_FILE = Paths.get(System.getProperty("user.home")).resolve("employee.json");
 
    public static void main(String[] args) throws IOException {
        final var employee = Employee.instance()
                .withFirstName(Name.from("John"))
                .withLastName(Name.from("Smith"))
                .withAge(Age.ofFullYears(30))
                .withSalary(Money.ofMajor(110_000))
                .withSkills(Skills.of("Database", "JavaEE", "REST"))
                .build();
 
        demo(employee, Format.JSON_1);
        demo(employee, Format.JSON_2);
    }
 
    private static void demo(Employee e, Format format) throws IOException {
        println(format.decription);
        final var converter = format.employee;
        println("value:  " + e);
        final var str = converter.toString(e);
        println("doc:    " + str);
        final var parsed = converter.fromString(str);
        println("parsed: " + parsed);
        println("value == parsed: " + (e.equals(parsed)));
        println("writing to ``" + DEMO_FILE + "''...");
        Files.write(DEMO_FILE, converter.toBytes(e));
        println("reading from ``" + DEMO_FILE + "''...");
        final var read = converter.fromBytes(Files.readAllBytes(DEMO_FILE));
        println("read:   " + read);
        println("value == read: " + (e.equals(read)));
        println("");
    }
 
    private static void println(Object o) {
        System.out.println(o);
    }
}
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package victorfx.serializers;
 
import victorfx.model.Employee;
 
public enum Format {
 
    JSON_1("Jackson", new Converter<>(DTO.Employee.CODER, Jackson.coders(DTO.Employee.class))),
 
    JSON_2("GSON", new Converter<>(DTO.Employee.CODER, Gson.coders(DTO.Employee.class)));
 
    public final String decription;
    public final Converter<Employee> employee;
 
    Format(String decription, Converter<Employee> employee) {
        this.decription = decription;
        this.employee = employee;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package victorfx.serializers;
 
public final class Converter<M> {
 
    private final Coder<M, String> string;
    private final Coder<M, byte[]> bytes;
 
    <D> Converter(Coder<M, D> dto, Coders<D> coders) {
        this.string = dto.wrap(coders.string);
        this.bytes = dto.wrap(coders.bytes);
    }
 
    public String toString(M model) {
        return string.encode(model);
    }
 
    public byte[] toBytes(M model) {
        return bytes.encode(model);
    }
 
    public M fromString(String data) {
        return string.decode(data);
    }
 
    public M fromBytes(byte[] data) {
        return bytes.decode(data);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package victorfx.serializers;
 
import java.util.Objects;
 
public interface Coder<S, D> {
 
    D encode(S source);
 
    S decode(D data);
 
    default <M> Coder<S, M> wrap(Coder<D, M> inner) {
        Objects.requireNonNull(inner);
        return new ComposedCoder<>(this, inner);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
package victorfx.serializers;
 
final class Coders<T> {
 
    final Coder<T, String> string;
    final Coder<T, byte[]> bytes;
 
    Coders(Coder<T, String> string, Coder<T, byte[]> bytes) {
        this.string = string;
        this.bytes = bytes;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package victorfx.serializers;
 
final class ComposedCoder<A, B, C> implements Coder<A, C> {
 
    private final Coder<A, B> outer;
    private final Coder<B, C> inner;
 
    ComposedCoder(Coder<A, B> outer, Coder<B, C> inner) {
        this.outer = outer;
        this.inner = inner;
    }
 
    @Override
    public C encode(A source) {
        return inner.encode(outer.encode(source));
    }
 
    @Override
    public A decode(C data) {
        return outer.decode(inner.decode(data));
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package victorfx.serializers;
 
import java.nio.charset.StandardCharsets;
 
final class Gson {
 
    private static final com.google.gson.Gson GSON = new com.google.gson.Gson();
 
    static <T> Coders<T> coders(Class<T> type) {
        return new Coders<>(string(type), bytes(type));
    }
 
    static <T> Coder<T, String> string(Class<T> type) {
        return new Str<>(type);
    }
 
    static <T> Coder<T, byte[]> bytes(Class<T> type) {
        return new Bytes<>(type);
    }
 
    private static final class Str<T> implements Coder<T, String> {
 
        private final Class<T> type;
 
        private Str(Class<T> type) {
            this.type = type;
        }
 
        @Override
        public String encode(T source) {
            return GSON.toJson(source);
        }
 
        @Override
        public T decode(String data) {
            return GSON.fromJson(data, type);
        }
    }
 
    private static final class Bytes<T> implements Coder<T, byte[]> {
 
        private final Class<T> type;
 
        private Bytes(Class<T> type) {
            this.type = type;
        }
 
        @Override
        public byte[] encode(T source) {
            return GSON.toJson(source).getBytes(StandardCharsets.UTF_8);
        }
 
        @Override
        public T decode(byte[] data) {
            return GSON.fromJson(new String(data, StandardCharsets.UTF_8), type);
        }
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package victorfx.serializers;
 
import com.fasterxml.jackson.databind.ObjectMapper;
 
import java.io.IOException;
import java.io.UncheckedIOException;
 
public final class Jackson {
 
    private static final ObjectMapper MAPPER = new ObjectMapper();
 
    static <T> Coders<T> coders(Class<T> type) {
        return new Coders<>(string(type), bytes(type));
    }
 
    static <T> Coder<T, String> string(Class<T> type) {
        return new Str<>(type);
    }
 
    static <T> Coder<T, byte[]> bytes(Class<T> type) {
        return new Bytes<>(type);
    }
 
    private static final class Str<T> implements Coder<T, String> {
 
        private final Class<T> type;
 
        private Str(Class<T> type) {
            this.type = type;
        }
 
        @Override
        public String encode(T source) {
            return unchecked(() -> MAPPER.writeValueAsString(source));
        }
 
        @Override
        public T decode(String data) {
            return unchecked(() -> MAPPER.readValue(data, type));
        }
    }
 
    private static final class Bytes<T> implements Coder<T, byte[]> {
 
        private final Class<T> type;
 
        private Bytes(Class<T> type) {
            this.type = type;
        }
 
        @Override
        public byte[] encode(T source) {
            return unchecked(() -> MAPPER.writeValueAsBytes(source));
        }
 
        @Override
        public T decode(byte[] data) {
            return unchecked(() -> MAPPER.readValue(data, type));
        }
    }
 
    private static <R> R unchecked(IOSupplier<R> value) {
        try {
            return value.get();
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }
 
    @FunctionalInterface
    private interface IOSupplier<R> {
 
        R get() throws IOException;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package victorfx.serializers;
 
import victorfx.model.*;
 
import java.math.BigDecimal;
import java.util.Objects;
import java.util.stream.Stream;
 
final class DTO {
 
    static final class Employee {
 
        public String firstName;
        public String lastName;
        public int age;
        public BigDecimal salary;
        public String[] skills;
 
        public static final Coder<victorfx.model.Employee, DTO.Employee> CODER = new Coder<>() {
 
            @Override
            public Employee encode(victorfx.model.Employee model) {
                final var dto = new DTO.Employee();
                dto.firstName = model.firstName().toString();
                dto.lastName = model.lastName().toString();
                dto.age = model.age().fullYears();
                dto.salary = model.salary().amount();
                dto.skills = model.skills().stream().map(Objects::toString).toArray(String[]::new);
                return dto;
            }
 
            @Override
            public victorfx.model.Employee decode(Employee dto) {
                return victorfx.model.Employee.instance()
                        .withFirstName(Name.from(dto.firstName))
                        .withLastName(Name.from(dto.lastName))
                        .withAge(Age.ofFullYears(dto.age))
                        .withSalary(Money.of(dto.salary))
                        .withSkills(Stream.of(dto.skills).map(Skill::from).toArray(Skill[]::new))
                        .build();
            };
        };
    }
 
    private DTO() {
        throw new UnsupportedOperationException("Utility class");
    }
}


Добавлено через 3 минуты
И модель:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package victorfx.model;
 
import java.util.Objects;
 
public final class Employee {
 
    public static Builder instance() {
        return new Builder();
    }
 
    private final Name firstName;
    private final Name lastName;
    private final Age age;
    private final Money salary;
    private final Skills skills;
 
    private Employee(Builder b) {
        this.firstName = b.firstName;
        this.lastName = b.lastName;
        this.age = b.age;
        this.salary = b.salary;
        this.skills = b.skills;
    }
 
    public Name firstName() {
        return firstName;
    }
 
    public Name lastName() {
        return lastName;
    }
 
    public Age age() {
        return age;
    }
 
    public Money salary() {
        return salary;
    }
 
    public Skills skills() {
        return skills;
    }
 
    @Override
    public String toString() {
        return firstName + " " + lastName + " (" + age + ") $" + salary + " " + skills;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return firstName.equals(employee.firstName) &&
                lastName.equals(employee.lastName) &&
                age.equals(employee.age) &&
                salary.equals(employee.salary) &&
                skills.equals(employee.skills);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(firstName, lastName, age, salary, skills);
    }
 
    public static final class Builder {
 
        private Name firstName;
        private Name lastName;
        private Age age;
        private Money salary = Money.zero();
        private Skills skills = Skills.none();
 
        private Builder() {}
 
        public Employee build() {
            return new Employee(this);
        }
 
        public Builder withFirstName(Name firstName) {
            this.firstName = Objects.requireNonNull(firstName);
            return this;
        }
 
        public Builder withLastName(Name lastName) {
            this.lastName = Objects.requireNonNull(lastName);
            return this;
        }
 
        public Builder withAge(Age age) {
            this.age = Objects.requireNonNull(age);
            return this;
        }
 
        public Builder withSalary(Money salary) {
            this.salary = Objects.requireNonNull(salary);
            return this;
        }
 
        public Builder withSkills(Skills skills) {
            this.skills = Objects.requireNonNull(skills);
            return this;
        }
 
        public Builder withSkills(Skill... skills) {
            this.skills = Skills.of(skills);
            return this;
        }
    }
}
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package victorfx.model;
 
import java.util.Objects;
 
public final class Name implements Comparable<Name> {
 
    public static Name from(String s) {
        Objects.requireNonNull(s);
        if (s.isBlank()) {
            throw new IllegalArgumentException("Empty name");
        }
        return new Name(s.trim());
    }
 
    private final String name;
 
    private Name(String name) {
        this.name = name;
    }
 
    @Override
    public String toString() {
        return name;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Name name1 = (Name) o;
        return name.equals(name1.name);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
 
    @Override
    public int compareTo(Name that) {
        return this.name.compareTo(that.name);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package victorfx.model;
 
import java.util.Objects;
 
public final class Age implements Comparable<Age> {
 
    public static Age ofFullYears(int years) {
        if (years < 0) {
            throw new IllegalArgumentException("Negative years: " + years);
        }
        return new Age(years);
    }
 
    private final int fullYears;
 
    private Age(int fullYears) {
        this.fullYears = fullYears;
    }
 
    public int fullYears() {
        return fullYears;
    }
 
    @Override
    public String toString() {
        return "" + fullYears;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Age age = (Age) o;
        return fullYears == age.fullYears;
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(fullYears);
    }
 
    @Override
    public int compareTo(Age that) {
        return Integer.compare(this.fullYears, that.fullYears);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package victorfx.model;
 
import java.math.BigDecimal;
import java.util.Objects;
 
public final class Money {
 
    private static final Money ZERO = new Money(BigDecimal.ZERO);
 
    public static Money zero() {
        return ZERO;
    }
 
    public static Money of(BigDecimal amount) {
        if (amount.signum() < 0) {
            throw new IllegalArgumentException("Negative amount: " + amount);
        }
        if (amount.equals(BigDecimal.ZERO)) {
            return zero();
        }
        return new Money(amount);
    }
 
    public static Money ofMajor(long major) {
        if (major < 0) {
            throw new IllegalArgumentException("Negative amount: " + major);
        }
        if (major == 0) {
            return zero();
        }
        return new Money(BigDecimal.valueOf(major));
    }
 
    private final BigDecimal amount;
 
    private Money(BigDecimal amount) {
        this.amount = amount;
    }
 
    public BigDecimal amount() {
        return amount;
    }
 
    public Money add(Money m) {
        return new Money(amount.add(m.amount));
    }
 
    @Override
    public String toString() {
        return amount.toString();
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Money money = (Money) o;
        return amount.equals(money.amount);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(amount);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package victorfx.model;
 
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
public final class Skills {
 
    private static final Skills NONE = new Skills(Collections.emptySet());
 
    public static Skills none() {
        return NONE;
    }
 
    public static Skills of(String... skills) {
        if (skills == null || skills.length == 0) {
            return none();
        }
        return new Skills(setOf(Stream.of(skills).map(Skill::from)));
    }
 
    public static Skills of(Skill... skills) {
        if (skills == null || skills.length == 0) {
            return none();
        }
        return new Skills(setOf(Stream.of(skills)));
    }
 
    private static Set<Skill> setOf(Stream<Skill> skills) {
        return skills.collect(Collectors.toCollection(TreeSet::new));
    }
 
    private final Set<Skill> skills;
 
    private Skills(Set<Skill> skills) {
        this.skills = skills;
    }
 
    public Skills add(Skill skill) {
        if (skills.contains(skill)) {
            return this;
        }
        final var newSkills = new TreeSet<>(skills);
        newSkills.add(skill);
        return new Skills(newSkills);
    }
 
    public Skills remove(Skill skill) {
        if (!skills.contains(skill)) {
            return this;
        }
        final var newSkills = new TreeSet<>(skills);
        newSkills.remove(skill);
        return new Skills(newSkills);
    }
 
    public Collection<Skill> all() {
        return Collections.unmodifiableSet(skills);
    }
 
    public Stream<Skill> stream() {
        return skills.stream();
    }
 
    public Stream<Skill> parallelStream() {
        return skills.parallelStream();
    }
 
    @Override
    public String toString() {
        return skills.toString();
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Skills skills1 = (Skills) o;
        return skills.equals(skills1.skills);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(skills);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package victorfx.model;
 
import java.util.Objects;
 
public final class Skill implements Comparable<Skill> {
 
    public static Skill from(String name) {
        Objects.requireNonNull(name);
        if (name.isBlank()) {
            throw new IllegalArgumentException("Empty skill name");
        }
        return new Skill(name.trim());
    }
 
    private final String name;
 
    private Skill(String name) {
        this.name = name;
    }
 
    @Override
    public String toString() {
        return name;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Skill skill = (Skill) o;
        return name.equals(skill.name);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
 
    @Override
    public int compareTo(Skill that) {
        return this.name.compareTo(that.name);
    }
}


Добавлено через 2 минуты
=>

Код
20:50:38: Executing task 'Demo.main()'...

> Task :compileJava
> Task :processResources NO-SOURCE
> Task :classes

> Task :Demo.main()
Jackson
value:  John Smith (30) $110000 [Database, JavaEE, REST]
doc:    {"firstName":"John","lastName":"Smith","age":30,"salary":110000,"skills":["Database","JavaEE","REST"]}
parsed: John Smith (30) $110000 [Database, JavaEE, REST]
value == parsed: true
writing to ``/Users/andrey/employee.json''...
reading from ``/Users/andrey/employee.json''...
read:   John Smith (30) $110000 [Database, JavaEE, REST]
value == read: true

GSON
value:  John Smith (30) $110000 [Database, JavaEE, REST]
doc:    {"firstName":"John","lastName":"Smith","age":30,"salary":110000,"skills":["Database","JavaEE","REST"]}
parsed: John Smith (30) $110000 [Database, JavaEE, REST]
value == parsed: true
writing to ``/Users/andrey/employee.json''...
reading from ``/Users/andrey/employee.json''...
read:   John Smith (30) $110000 [Database, JavaEE, REST]
value == read: true


BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed
20:50:39: Task execution finished 'Demo.main()'.
1
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
29.06.2019, 21:31  [ТС] 8
korvin_, Огромное спасибо. Выглядит просто внушительно!
0
29.06.2019, 21:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2019, 21:31
Помогаю со студенческими работами здесь

Json Parser
Добрый день. Подскажите пожалуйста, как распарсить базу в json: $json = Get-Content...

json parser
Поступила задачка научить программу понимать ответы сервера в формате JSON. СТалкивался ли кто-то...

JSON.parser
Здраствуйте , не могу распарсить JSON {&quot;response&quot;:} в body таходится сам json Делаю так...

Parser JSON
Меня интересует как можно получить фото или видео вот с такого кода response: { count: 234234,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru