Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
1

Взять внутренний JSON как строку

07.08.2020, 11:32. Просмотров 2247. Ответов 5
Метки нет (Все метки)

Добрый день.

Очень нужна ваша помощь.

Есть JSON, который можно представить в ява объектах как:
Java
1
2
3
4
5
class WrapperTarget<T>{ 
String f1;
Integer f2;
List<T> target;
}
Или как json.
JSON
1
{"f1":"qql", "f2":1, "target": [{},{}]}

Цель - нужно взять внутренний объект target, как строку. То есть распарсить внешний json, не трогая внутренний.
Я думал, что это просто и вообще является тривиальной операцией. Но ничего подобного - я не нашел, как это сделать.

Тогда я пошел на хитрость и использовал в качестве дженерика класс Object. Тогда я получал то, что мне нужно. Почти.
Я распарсивал внутренний объект и Обджект и обратно сериализовал его в строку.
Но тут происходит страшная вещь, которая руинит смысл внутреннего объекта. Вот такая штука:
JSON
1
"client":{"id":1.00000248745E11}
Как вы понимаете - значение должно быть таким: id = 100000248745. А не какой-то единицей с плавающей точкой.

То есть он классический INT переводит в DOUBLE.
Из-за чего у меня руинится дальнейший парсинг, когда он нужен: Expected an int but was 1.00000248733E11 at line 1 column 939 path $.client.id.

И вот что мне делать? Есть два пути:
Либо искать способ вырезать внутренний json в первозданном виде.
Либо искать, как заменить при парсинге вещественные числа на целые.

Помогите, пожалуйста.

Добавлено через 18 минут
Упс, я только что понял, что значение id = 100000248745 больше, чем максимальный инт. Поэтому оно в него и не записывалось.

Однако, это не снимает вопрос: можно ли получить внутренний объект в первозданном виде?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2020, 11:32
Ответы с готовыми решениями:

Как взять информацию из JSON list или array?
В этом JSON есть cnt для чего-то и list, а в нём ,.. Как зайти в эти 0,1 и их взять. Я сделал,...

Как взять строку из файла
Нужно в веб форму вставлять поочередно емайлы из файла. Как это сделать. Как я понимаю...

Как взять предыдущую строку из dataGridView?
Добрый день! Нужно сложить значения ячеек: текущая строка(второй столбец) + предыдущая(второй...

Как взять строку из ListBox по индексу?
Подскажите начинающему как можно присвоить переменной s значение 1-й строки листбокса? Я пробовал...

5
Модератор
1425 / 425 / 140
Регистрация: 11.08.2017
Сообщений: 1,445
07.08.2020, 12:40 2
Java
1
2
3
4
5
6
7
8
9
10
11
12
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
 
public class Inside {
    public static void main(String[] args) {
        String test = "{\"f1\":\"qql\", \"f2\":1, \"target\": [{\"client\":{\"id\":124}},{}]}";
        System.out.println(test);
        JsonObject jsonTree = JsonParser.parseString(test).getAsJsonObject();
        System.out.println(jsonTree.get("target"));
        
    }
}
Не пойдет? Правда это по сути ручной парсинг json, если десириализовать, то можно с дженериками, но у меня с ними (без указания внутреннего класса если) съедаются кавычки внутри

Добавлено через 15 минут
Либо пример сериализации/десериализации с дженериками
Кликните здесь для просмотра всего текста
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
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;
 
public class Inside {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder().create();
        //сериализация с пустыми объектами
        WrapperTarget<Record> wt = new WrapperTarget<>();
        wt.f1 = "qq1";
        wt.f2 = 1;
        wt.target = new ArrayList<>();
        wt.target.add(new Record());
        wt.target.add(new Record());
        String json = gson.toJson(wt);
        System.out.println(json);
        //сериализация с заполненными
        wt.target.clear();
        Record r = new Record();
        r.client = new Client();
        r.client.id = 52;
        wt.target.add(r);
        wt.target.add(r);
        json = gson.toJson(wt);
        System.out.println(json);
        //десериализация
        String test = "{\"f1\":\"qql\", \"f2\":1, \"target\": [{\"client\":{\"id\":124}},{}]}";
        Type type = new TypeToken<WrapperTarget<Record>>(){}.getType();
        WrapperTarget<Record> wt2 = gson.fromJson(test, type);
        System.out.println(wt2.target);
        System.out.println(wt2.target.get(0).client.id);
        System.out.println(wt2.target.get(1).client);
    }
}
 
class WrapperTarget<T>{ 
String f1;
Integer f2;
List<T> target;
}
 
class Record {
    Client client;
}
 
class Client {
    int id;
}
0
Эксперт Java
2359 / 2189 / 558
Регистрация: 28.12.2010
Сообщений: 8,566
07.08.2020, 12:42 3
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
"client":{"id":1.00000248745E11}
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
Как вы понимаете - значение должно быть таким: id = 100000248745
с чего бы? У тебя в джсоне лежит 1.00000248745E11 почему он должен когда-то превратиться в 100000248745?

Зачем дженерики использовать? Напиши просто Object target или Map target
0
Модератор
1425 / 425 / 140
Регистрация: 11.08.2017
Сообщений: 1,445
07.08.2020, 12:57 4
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Map target
сериализуется не в массив объектов а в объекты через запятую грубо говоря
То есть Map<String, Object> будет иметь вид "target":{"String":{Object}, "String":{Object}, "String":{Object}}, причем вроде во всех Map-ах ключи должны быть уникальными, а тут судя по названию ключи не уникальные.
0
Эксперт Java
2359 / 2189 / 558
Регистрация: 28.12.2010
Сообщений: 8,566
07.08.2020, 13:02 5
да, не заметил что там массив. Тогда лист Object норм. Оbect по факту все равно будет инстансом MultiMap в рантайме
0
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
07.08.2020, 14:18  [ТС] 6
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Зачем дженерики использовать?
Есть json. Я написал, как его можно представить в программисто-читаемом виде - в виде списка объектов неизвестной структуры. И есть одинаковая над ними обертка.
В ява-классах это можно представить как дженерик класс.

Так что тут не стоит вопрос использования/не использования. Просто так есть.

Цитата Сообщение от KEKCoGEN Посмотреть сообщение
У тебя в джсоне лежит 1.00000248745E11 почему он должен когда-то превратиться в 100000248745?
Тут я понял, что изначально неверно расписал задачу. Не приведя пример верного json.

Смысл в том, что изначально json мне приходит в виде
JSON
1
{"f1":"qql", "f2":1, "target": [{"client":{"id":1}},{"client":{"id":2}}]}
(PS: очевидно, что это не единственный вариант джейсона, там может лежать объект любой другой структуры)
То есть ИД клиентов, что логично, представлены int'ом. А когда я уже извлекаю список внутренних объектов, то тип размывается в более "безопасный" - double.

Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
Упс, я только что понял, что значение id = 100000248745 больше, чем максимальный инт. Поэтому оно в него и не записывалось.
Как оказалось, это не является проблемой. Я думал, что ошибка преобразования возникает именно из-за типов: требуется инт, а на входе дабл.

Но нет, оказалось именно из-за вместимости типа.


Теперь задача лежит число в эстетической плоскости. Так как проблема изменения типов при извлечении внутреннего json'а проблемой и не является.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2020, 14:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как поочерёдно взять строку из файла
Привет всем. Возникла небольшая проблемка. Есть у меня файл с проксями и нужно при каждом...

Как из файла взять нужную строку?
Как из файла взять нужную строку?

Как распарсить json строку VK
Делаю запрос на VK API, получаю строку вида: Как теперь достать отсюда элементы? Нашел у себя...

Как добавить строку в JSON?
1) А как с массивами работать, как применить JSONArray???, надо в массив добавить 3 имени 2) Как...

Как парсить строку json?
есть строка (в текстовом файле): { {&quot;k4&quot; : 0.0},{&quot;k3&quot; : 0.0},{&quot;k2&quot; : 0.0},{&quot;k1&quot; : 0.0},{&quot;k0&quot;...

Как взять строку из файла и сделать ее переменной?
Проблема такая. Файл к примеру 1.txt там три строчки: 123,4546,4635464627,10...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.