У меня есть пружинный API, где мне нужно выполнить процесс над файлом json, который я получаю, и вернуть его на другой URL с результатом процесса.
У меня здесь 2 проблемы:
1 / Мне нужно прочитать JSONObject, который я получаю, потому что когда я отправляю файл json, я получаю пустой файл json.
2 / Мне нужно вернуть JSONObject. Я отправляю файл json, содержащий {"empty":true}
.
Прежде всего, мне навязывают библиотеку org.json, поэтому я не могу использовать никакую другую библиотеку (ну, я использовал org.json.simple, и она работала для меня, но потом они добавили библиотеку org.json) , Я попытался изменить получаемый объект на строку и выполнить процесс. Это работает, но я предпочитаю получать JSONObject.
Кстати, я посмотрел в интернете и stackoverflow, но я не нашел решения.
Вот основной код
@Service
public class DataService {
@Value("${my.config.api.atos.user}")
private String user;
@Value("${my.config.api.atos.password}")
private String password;
@Value("${my.config.folder}")
private String path;
//It works with org.json.simple library.
// I would prefer that the variable is a JSONObject
public static String processData(String str) {
JSONObject jsonObject = new JSONObject(str);
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Data data = new Data();
try {
data = mapper.readValue(jsonObject.toString(), Data.class);
} catch (IOException e) {
e.printStackTrace();
}
List<DataJson> timeserie = data.getData();
List<Double> values = new ArrayList<Double>();
DataJson inter;
for (int i = 0; i<timeserie.size(); i++){
inter = timeserie.get(i);
values.add(inter.getValue());
}
System.out.println(values);
int EmbeddingDimension;
EmbeddingDimension = data.getEmbeddingDimension();
data.setResult(DynamicProperties.PermEn(values, EmbeddingDimension));
String url = "http://localhost:8080/crosscpp/toolbox/test";
OkHttpClient client = new OkHttpClient();
ObjectMapper objectMapper = new ObjectMapper();
RequestBody body = null;
try {
body = RequestBody.create(
MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(data));
System.out.println(objectMapper.writeValueAsString(data));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Call call = client.newCall(request);
try {
Response response = call.execute();
String result = response.body().string();
System.out.println(result);
JSONObject json = new JSONObject(result);
System.out.println(json);
return result;
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
Вот объект json, который я отправляю:
{
"inputAeonSubscriptionUrl": "xxxx",
"outputAeonPublicationUrl": "xxxx",
"EmbeddingDimension": 3,
"offerId": "xxxxxx",
"measurement-channel-id": "1",
"id": "xxxxxx",
"submissionDate": {
"min": "2019-04-09",
"max": "2019-05-07"
},
"travelDates": {
"min": "2019-05-13",
"max": "2019-05-17"
},
"travelledDuration": {
"min": 1,
"max": 2
},
"geoBoundingBox": {
"latitude-max": 51.507561,
"latitude-min": 51.497715,
"longitude-min": 7.482349,
"longitude-max": 7.500885
},
"data": [{
"value": 1,
"timestamp": "2019-04-09"
},
{
"value": 3,
"timestamp": "2019-04-09"
},
{
"value": 2,
"timestamp": "2019-04-09"
},
{
"value": 1,
"timestamp": "2019-04-09"
},
{
"value": 2,
"timestamp": "2019-04-10"
},
{
"value": 3,
"timestamp": "2019-04-10"
},
{
"value": 2,
"timestamp": "2019-04-10"
}
]
}
вот DataController:
@RestController
public class DataController {
private final DataService dataservice;
@Autowired
public DataController(DataService dataservice) {
this.dataservice = dataservice;
}
@RequestMapping(method=RequestMethod.POST, value="/test")
public JSONObject getAllDataT(@RequestBody JSONObject data) {
return data;
}
@RequestMapping(method=RequestMethod.POST, value="/testjson")
public JSONObject getAllDataT2(@RequestBody JSONObject json) {
return json;
}
@RequestMapping(method = RequestMethod.POST, value = "/timeseries"/*, produces = "application/json"*/)
public JSONObject proccessAtosData(@RequestBody String data) {
return dataservice.processData(data);
}
@RequestMapping(method = RequestMethod.POST, value = "/save")
public void saveAtosData(@RequestBody JSONObject json) {
dataservice.savefile(json);
}
}
и, наконец, вот класс данных:
public class Data {
private String inputAeonSubscriptionUrl;
private String outputAeonPublicationUrl;
private int embeddingDimension;
private String offerId;
private String measurement_channel_id;
private String id;
private SubDate submissionDate;
private TravelDates travelDates;
private TravelDuration travelledDuration;
private GeoBoundingBox geoBoundingBox;
private List<DataJson> data;
private double result;
//private String model;
public Data(){
}
public Data(@JsonProperty("inputAeonSubscriptionUrl") String inputAeonSubscriptionUrl, @JsonProperty("outputAeonPublicationUrl") String outputAeonPublicationUrl,
@JsonProperty("EmbeddingDimension") int embeddingDimension, @JsonProperty("offerId") String offerId,
@JsonProperty("measurement-channel-id") String measurement_channel_id, @JsonProperty("id") String id,
@JsonProperty("submissionDate") SubDate submissionDate, @JsonProperty("travelDates") TravelDates travelDates,
@JsonProperty("travelledDuration") TravelDuration travelledDuration, @JsonProperty("geoBoundingBox") GeoBoundingBox geoBoundingBox,
@JsonProperty("data") List<DataJson> data/*, String model*/) {
this.inputAeonSubscriptionUrl = inputAeonSubscriptionUrl;
this.outputAeonPublicationUrl = outputAeonPublicationUrl;
this.embeddingDimension = embeddingDimension;
this.offerId = offerId;
this.measurement_channel_id = measurement_channel_id;
this.id = id;
this.submissionDate = submissionDate;
this.travelDates = travelDates;
this.travelledDuration = travelledDuration;
this.geoBoundingBox = geoBoundingBox;
this.data = data;
//this.model = model;
}
// getters amd setters
}
Если вам нужна дополнительная информация от меня, просто скажите мне, и я постараюсь опубликовать их.