Добавление вложенного объекта используя класс Formbody.Builder

Имеется код Java/kotlin, который собирает объект json и отправляет post-запрос на сервер, а конкретно - на скрипт php, который, в свою очередь, добавляет данный объект в файл json. Данные махинации мне необходимы для того, чтобы собирать данные о геолокации с устройств и посылать их на сервер для дальнейшей обработки сайтом - отображение полученных широты/долготы на карте. Для этого необходимо, чтобы объекты в файле json были упорядочены по id, где в id вложен объект с данными об устройстве. Вот код, который отправляет объект на сервер:

MainActivity.java

RequestBody formBody = new FormBody.Builder()
                .add("pseudoID",m_szDevIDShort)
                .add("latitude", format1.replace(',','.'))
                .add("longitude", format2.replace(',','.'))
                .add("velocity", vel)
                .add("distance", dis)
                .add("date", time)
                .add("azimuth",azimuth.replace(',','.'))
                .add("accuracy",accuracy.replace(',','.'))
                .build();
        //конечная цель(куда посылать пост-запрос)
        Request request = new Request.Builder()
                .url("https://geokrasnodar.ru/postJson.php")
                .addHeader("User-Agent", "OkHttp Bot")
                .post(formBody)
                .build();
        //обработка исключений
        try (Response response = httpClient.newCall(request).execute()) {

            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
            // Вывести ответ в консоль
            System.out.println(response.body().string());
        }
    }

И, собственно сам полученный объект

token_data.json

{"pseudoID":"353597872677244",
"latitude":"45.24368",
"longitude":"38.97344",
"azimuth":"253.6",
"accuracy":"14.7"}

Из чего я хочу сделать данный объект - вложенным в другой, то есть привести к такому виду:

[ID] =>{"latitude":"45.24368",
"longitude":"38.97344",
"azimuth":"253.6",
"accuracy":"14.7"},
[ID] => {
...
...
},
[ID] => ...

Ломаю голову, но всё равно пока что не могу понять, как это можно реализовать


Ответы (1 шт):

Автор решения: Дмитрий

Если я вас правильно понял, то вам в качестве результирующей структуры данных подойдет обычная коллекция типа ключ - значение. Тогда можно сделать примерно так:

import com.google.gson.Gson;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {
        
        String json = "{\"pseudoID\":\"353597872677244\",\n"
                + "\"latitude\":\"45.24368\",\n"
                + "\"longitude\":\"38.97344\",\n"
                + "\"azimuth\":\"253.6\",\n"
                + "\"accuracy\":\"14.7\"}";
        
        Gson gson = new Gson();
        
        SrcModel fromJson = gson.fromJson(json, SrcModel.class);
        List<SrcModel> srcModels = Collections.singletonList(fromJson);
        
        Map<Long, TargetModel> resultMap = srcModels.stream()
                .collect(Collectors.toMap(k->k.getPseudoID(), 
                        v->TargetModel.builder()
                                .latitude(v.getLatitude())
                                .longitude(v.getLongitude())
                                .azimuth(v.getAzimuth())
                                .accuracy(v.getAccuracy())
                                .build()));
        
        String result = gson.toJson(resultMap);
        
        System.out.println(result);
        
    }
    
}

@lombok.Data
@lombok.NoArgsConstructor
@lombok.AllArgsConstructor
@lombok.Builder
class SrcModel {

    private Long pseudoID;
    private Double latitude;
    private Double longitude;
    private Double azimuth;
    private Double accuracy;
}

@lombok.Data
@lombok.NoArgsConstructor
@lombok.AllArgsConstructor
@lombok.Builder
class TargetModel {

    private Double latitude;
    private Double longitude;
    private Double azimuth;
    private Double accuracy;
}
→ Ссылка