我正在开发一个应用程序,我必须在其中为传入的数据创建SHA256哈希。为了实现这一点,我必须遵循每个属性的特定排序顺序。因此,我创建了一个类TemplateNodeMap
,它扩展了LinkedHashMap
,在其中我指定了我需要遵循的顺序。
现在,我想读取传入JSON数据中的每个属性,添加一个特定字段,并创建哈希字符串。我对添加数据和创建字符串有点困惑。我担心我是否遵循了最佳过程,因为我需要遵循大量数据的过程。
有人能告诉我这是不是正确的方法吗?
以下是传入的JSON(由于JSON可以有任何顺序,因此我需要根据所需的哈希字符串顺序来获取属性):
{
"age": 30,
"name": "Batman",
"address": {
"city": "Gotham",
"street": {
"name": "Gotham 123"
}
}
}
下面是我的TemplateNodeMap
类:
package io.hash;
import java.util.LinkedHashMap;
public class TemplateNodeMap extends LinkedHashMap {
public TemplateNodeMap() {
put("name", null);
put("age", null);
put("address", new LinkedHashMap<>() {{
put("street", new LinkedHashMap<>() {{
put("name", null);
}});
put("city", null);
}});
}
}
下面是我的ApplicationMain
类,它阅读数据并将其加载到TemplateNodeMap
:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.IOException;
import java.io.InputStream;
public class ApplicationMain {
public static void main(String[] args) throws IOException {
final ObjectMapper objectMapper = new ObjectMapper();
final InputStream jsonStream = ApplicationMain.class.getResourceAsStream("/InputJSON.json");
final ObjectNode inputTemplate = objectMapper.readValue(jsonStream, ObjectNode.class);
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(inputTemplate));
final TemplateNodeMap templateNodeMap = new TemplateNodeMap();
templateNodeMap.put("name", inputTemplate.get("name"));
templateNodeMap.put("age", inputTemplate.get("age"));
//Unable to understand how to insert the complex object values into LinkedHashMap and follow the order
}
}
1.我不明白如何将复杂对象添加到LinkedHashMap中并从中创建字符串。
1.不是所有的字段都是强制的,所以我想在创建哈希字符串的过程中省略空值。
有人能告诉我如何实现这一点吗?这是否是基于所需顺序创建哈希字符串的正确方法?
2条答案
按热度按时间t2a7ltrp1#
有两个Jackson注解可以帮助您以自定义顺序序列化jackson属性(不包括非空值):
JsonPropertyOrder
注解,可用来定义序列化对象属性时要使用的顺序(可能是部分顺序)。JsonInclude
注解,用于指示何时序列化带注解的属性的值或带注解的类的所有属性。然后,您可以将json反序列化为pojo java类,然后将它们序列化,从而获得一个新的json,该json具有预期的属性顺序,并且没有空属性:
kcugc4gi2#
要求:
建议:
第一个
您可以检查https://dencode.com/hash处的散列值(链接已经包含JSON数据。如果您在此处粘贴文本,请验证是否选择了正确的行尾类型。)