java - 使用多态性从 JSON 生成对象

标签 java json jackson polymorphism

我有这个 JSON,我想用它生成对象。

{
  "responseId": "response-id",
  "session": "projects/project-id/agent/sessions/session-id",
  "queryResult": {
    "queryText": "End-user expression",
    "parameters": {
      "orderNumber": "PQL7648194AAAAA",
      "lastName": "RIVERO"
    },
    "action": "order",
    "allRequiredParamsPresent": true,
    "intent": {
      "name": "projects/project-id/agent/intents/intent-id",
      "displayName": "[InfoVuelo] Dia-hora de salida - datos de orden"
    },
    "languageCode": "es"
  },
  "originalDetectIntentRequest": {}
}

“参数”字段是可变的。例如,对于一种情况,参数可以是

{
  "parameters": {
     "email":"example@example.com"
  }
}

另外,我也可以

{
"parameters": {
        "orderNumber": "PQL7648194AAAAA",
        "lastName": "RIVERO"
    }
}

我创建了一个Parameters类和2个扩展Parameters的类(OrderNumberAndLastNameParamsEmailParams)

public class EmailParams implements Parameters {
    private String email;
}  

public class OrderNumberLastNameParams implements Parameters {
    private String orderNumber;

    private String lastName;
}

我使用给定 JSON 文件创建对象的方法

public static <T> T buildBodyFromJson(String filePath, Class<T> clazz) {
    ObjectMapper myMapper = new ObjectMapper();
    T jsonMapper = null;
    try {
      jsonMapper = myMapper.readValue(new ClassPathResource(filePath).getInputStream(), clazz);
    } catch (IOException e) {
      fail(e.getLocalizedMessage());
    }
    return jsonMapper;
  }

但是当我尝试构建对象时,它尝试实例化 Parameter 对象,而不是子对象获取“无法识别的字段...未标记为可忽略”

最佳答案

据我了解,您实际上并不需要两个单独的类,问题是您需要使用该对象生成一个不包含 null/空字段的 requestbody。 嗯,有一个注释可能会对您有所帮助。

为具有所有 3 个属性的参数创建一个类,并使用 @JsonInclude(JsonInclude.Include.NON_EMPTY) 进行注释

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Parameters  {
    private String email;
    private String orderNumber;
    private String lastName;
}  

此注释会使空字段或 null 字段不会出现在您正在创建的请求正文中。

关于java - 使用多态性从 JSON 生成对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61021451/

相关文章:

java - 父类中的 getter 和 setter

java - 将 JSON 发送到 Spark Streaming 时如何保留 JSON 结构

java - 通过<html :link>发送参数值struts1

javascript - Node.js - child_process.exec 和输出重定向

python - 在Python中读取大型JSON文件

javascript - Django request.DATA 获取损坏的值

java - 可选属性上的 @JsonFormat

java - Maven 配置文件不执行测试

java - 如果接收到无效的 JSON,则不会调用 ExceptionMapper

json - json 文件中的 Camel Case 属性名称未映射到 Java 对象