3 回答
TA贡献2016条经验 获得超9个赞
这对我有用:
JSONArray jsonArray = (JSONArray)jsonObj.get("data"); JSONObject jsonObject = ((JSONObject)(jsonArray).get(0)); jsonObject.put("name", "abc"); System.out.println(jsonObj.toJSONString());
TA贡献1796条经验 获得超10个赞
有时您可能会遇到以灵活的方式完美替换某些值的情况。所以我想展示这个使用json-path依赖项的附加方法。
指定路径集合来替换真实数据,例如:
import static com.google.common.collect.Lists.newArrayList;
...
private static final List<String> PATHS_TO_REPLACE = newArrayList(
"$.email",
"$.colleagues.[*].email",
"$.other.required.pathmask"
);
最重要的代码部分:
public String maskSensitiveData(String asJson) {
DocumentContext parsed = JsonPath.parse(asJson);
PATHS_TO_REPLACE.forEach(path -> parsed.set(path, "***starred***"));
return parsed.jsonString();
}
为了避免com.jayway.jsonpath.PathNotFoundException如果您确定必须抑制它们,您可以使用特殊配置:
private static final Configuration CONFIGURATION = Configuration
.builder()
.options(Option.SUPPRESS_EXCEPTIONS)
.build();
并parsed应以更新的方式提供文件:
DocumentContext parsed = JsonPath.using(CONFIGURATION).parse(asJson);
要使用代码,我建议尝试为相应的服务准备测试。
聚苯乙烯
如果您想以动态方式计算星星以设置值(或仅隐藏部分数据),也可以处理。为了使数据数组保持简单,请注意map同一对象的方法。相应的示例也添加到服务中:
public String flexibleMaskingSensitiveData(String asJson) {
DocumentContext parsed = JsonPath.using(CONFIGURATION).parse(asJson);
PATHS_TO_REPLACE.forEach(path -> parsed.map(path,
(currentValue, conf) -> starringCurrentValue(currentValue)));
return parsed.jsonString();
}
private Object starringCurrentValue(Object currentValue) {
return ofNullable(currentValue)
.filter(String.class::isInstance)
.map(String.class::cast)
.map(String::length)
.map(times -> StringUtils.repeat('*', times))
.orElse("");
}
添加回答
举报