Как определить модель данных без POJOS для полученного формата JSON? - PullRequest
0 голосов
/ 24 сентября 2019

Мне нужно подготовить модель к ответу, который будет отправлен модели.

Это пример полученного формата JSON:

{
\\ rest of the model
"Model": {
    "name": "name_01",
    "description": "name_01",
    "features": {
      "name": "feature 01",
      "description": "feature 01"
    }
  }
\\ Rest of the model
}

Ответ, отправляемый во внешний интерфейс:

{
\\ rest of the model

"model_name":"name_01",
"feature_name":"feature_01"
}
\\ rest of the model

Это то, что я реализовал до сих пор:

Код:

@SuppressWarnings("unchecked")
    @JsonProperty("model")
    private void unpackNestedModel(Map<String,Object> model) {
        this.model_name = (String) model.get("name");
        Map<String, Object> model2 = (Map<String, Object>) model.get("features");
        this.feature_name = (String) model2.get("name");
    }

Есть ли лучший способ?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Предполагается, что вы используете Джексона, и полезная нагрузка вашего запроса выглядит следующим образом:

{
  "Model": {
    "name": "name_01",
    "description": "name_01",
    "features": {
      "name": "feature 01",
      "description": "feature 01"
    }
  }
}

У вас могут быть следующие классы для его представления:

@Data
public class RequestData {

    @JsonProperty("Model")
    private Model model;
}
@Data
public class Model {

    private String name;
    private String description;
    private Features features;
}
@Data
public class Features {

    private String name;
    private String description;
}

Если вы включите функцию десериализации UNWRAP_ROOT_VALUE в вашем ObjectMapper, вы можете просто иметь:

@Data
@JsonRootName("Model")
public class Model {

    private String name;
    private String description;
    private Features features;
}
@Data
public class Features {

    private String name;
    private String description;
}

Если ваша полезная нагрузка ответа будет такой:

{
  "model_name": "name_01",
  "feature_name": "feature_01"
}

Вы можете иметь:

@Data
public class ResponseData {

    @JsonProperty("model_name")
    private String modelName;

    @JsonProperty("feature_name")
    private String featureName;
}
1 голос
/ 24 сентября 2019

Вы можете проанализировать результат с помощью JSONObject, но предложите использовать результат json через POJO Object.

@Test
public void test02() {
    String receivedJson = "{\"Model\":{\"name\":\"name_01\",\"description\":\"name_01\",\"features\":{\"name\":\"feature 01\",\"description\":\"feature 01\"}}}";
    JSONObject receivedObj = JSONObject.parseObject(receivedJson);

    JSONObject model = (JSONObject) receivedObj.get("Model");
    JSONObject features = (JSONObject) model.get("features");

    JSONObject responseObj = new JSONObject();
    responseObj.put("model_name", model.getString("name"));
    responseObj.put("feature_name", features.getString("name"));

    System.out.println(responseObj);
    //output in console
    //{"model_name":"name_01","feature_name":"feature 01"}
}
...