jackson 如何使用LinkedHashMap排序和创建哈希字符串?

vbopmzt1  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(316)

我正在开发一个应用程序,我必须在其中为传入的数据创建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.不是所有的字段都是强制的,所以我想在创建哈希字符串的过程中省略空值。
有人能告诉我如何实现这一点吗?这是否是基于所需顺序创建哈希字符串的正确方法?

t2a7ltrp

t2a7ltrp1#

有两个Jackson注解可以帮助您以自定义顺序序列化jackson属性(不包括非空值):

  • JsonPropertyOrder注解,可用来定义序列化对象属性时要使用的顺序(可能是部分顺序)。
  • JsonInclude注解,用于指示何时序列化带注解的属性的值或带注解的类的所有属性。

然后,您可以将json反序列化为pojo java类,然后将它们序列化,从而获得一个新的json,该json具有预期的属性顺序,并且没有空属性:

@Data
@JsonPropertyOrder(value = {"name", "age", "address"})
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Person {
    private int age; 
    private String name;
    private Address address;
}

@Data
@JsonPropertyOrder(value = {"street", "city"})
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Address {
    private String city;
    private Street street;
}

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Street {
    private String name;
}

//you can delete for example the name property from your json
Person person = mapper.readValue(json, Person.class);
String output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(person);
//ok, the name property will not appear in the output because it's null
System.out.println(output);
kcugc4gi

kcugc4gi2#

要求:

  • “我正在开发一个应用程序,我必须在其中为传入数据创建SHA256哈希。”
  • “要做到这一点,我必须遵循每个属性的特定排序顺序。”

建议:

  • 为传入数据创建数据类,根据需要对其属性进行排序
  • 使用prettyprint将数据类转换为“标准”JSON表示形式
  • 通过“标准”JSON表示计算哈希
  • 为了完整性,包含了链接散列表的手动解析

第一个
您可以检查https://dencode.com/hash处的散列值(链接已经包含JSON数据。如果您在此处粘贴文本,请验证是否选择了正确的行尾类型。)

相关问题