【问题标题】:Jackson : Partially update bean with json StringJackson:使用 json String 部分更新 bean
【发布时间】:2020-02-10 13:33:59
【问题描述】:

我正在编写一个测试套件,其中包括 ping 具有不同有效负载的 API。以下是示例有效载荷(示例):

{
   "param_1" : "value_1",
   "param_2" : "value_2",
   "param_3" : "value_3",
   "param_4" : "value_4",
   "param_5" : "value_5",
   "location" : {
        "region" : "EU"
   },
   "additional_params" : {
        "availability" : "high",
        "volume" : "low"
   }
}

我在json 文件中写入了上述有效负载,测试套件执行以下操作:

  • 读取json文件并为payload创建一个bean
  • 发送POST 请求
  • 断言响应

现在,我需要使用不同的值组合来测试相同的 API,例如美国地区,低可用性,低容量等。请求有很多其他参数,但只有上述参数发生变化。要对此进行测试,我可以执行以下操作:

  • 为每个场景创建一个json 文件
  • 只创建一个json 文件,对其进行反序列化并将组合存储到另一个文件中,如下所示:
[
  {
    "location": {
        "region": "US"
    },
    "additional_params" : {
        "availability" : "high",
        "volume" : "high"
    }
  },
  {
    "location": {
        "region": "EU"
    },
    "additional_params" : {
        "availability" : "low",
        "volume" : "low"
    }
  }
]

然后我可以读取这个文件,在每次发送请求之前更新基础对象。

第一种方法的问题是,我最终会得到很多具有 90% 重复内容的文件。对于第二种方法,jackson 是否提供 API 来反序列化基础对象并应用我上面提到的更改?

【问题讨论】:

    标签: java json jackson deserialization


    【解决方案1】:

    对于第二种方法,Jackson 是否提供 API 来反序列化基础对象并应用我上面提到的更改?

    嗯,Jackson 提供了一些可能对您有用的东西。我不确切知道您是如何构建测试的,但一种可能的方法是使用@JacksonInject,因为它允许将值注入您的 bean。

    你可以定义模型类如下:

    @Data
    public class Payload {
    
        private Location location;
    
        @JsonProperty("additional_params")
        private AdditionalParameters additionalParameters;
    }
    
    @Data
    public class Location {
    
        @JacksonInject("region")
        private String region;
    }
    
    @Data
    public class AdditionalParameters {
    
        @JacksonInject("availability")
        private String availability;
    
        @JacksonInject("volume")
        private String volume;
    }
    

    那么你可以使用:

    String json = "{\n"
            + "    \"location\": {},\n"
            + "    \"additional_params\": {}\n"
            + "  }";
    
    ObjectMapper mapper = new ObjectMapper();
    mapper.setInjectableValues(new InjectableValues.Std()
            .addValue("region", "EU")
            .addValue("availability", "high")
            .addValue("volume", "low")
    );
    
    Payload payload = mapper.readValue(json, Payload.class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 2012-04-16
      • 2015-12-01
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      相关资源
      最近更新 更多