【问题标题】:HashMap versus Object ? Which one is better to finally generate JSON output with KEY and VALUEHashMap 与 Object ?最终生成带有 KEY 和 VALUE 的 JSON 输出哪个更好
【发布时间】:2019-08-23 04:14:24
【问题描述】:

我确实有这个用例。

  1. 调用者(同一微服务或不同微服务中的 API)希望将不同的 KEYS 和 VALUES 作为审计报告作为其方法的一部分。
  2. 某些 KEYS 很可能很常见,大多数调用者都可以报告。
  3. 当使用来自多个调用者的 KEY NAME 来报告相同的 KEY 时,必须保持一致性。示例:如果所有人都想报告消费者 ID,那么所有调用者只需要使用键“consumerId”来实现不同调用者之间的一致性。
  4. 可以有一些可重用的枚举类来保存所有的通用键,就像上面一样,这样每个调用者都可以使用。来电者仍然可以拥有自己想要报告的自定义 KEY。
  5. 所有调用者都不应该做重复的工作,比如如果 caller1、caller2 想要报告 consumerID(公共 KEY),那么我不想同时定义具有 consumerID 作为属性的类,然后将其转换为 JSON。

我想使用以下类型的实现。

枚举来保存公共 KEYS

public enum EnumKeys implements Key {
CONSUMERID("consumerId")
...
...
...
}

每个调用者可以用来报告 KEY AND VALUE 的通用类 @JsonPropertyOrder(字母=真) 公共类报告数据 {

private Map<String, Object> properties = new HashMap<>();

@JsonAnyGetter
public Map<String, Object> getProperties() {
    return properties;
}

public void setProperties(Map<String, Object> properties) {
    this.properties = properties;
}

public ReportData add(Key key, Object value){
    properties.put(key.getKeyName(), value);
    return this;
}

来电者 1 报告消费者 ID

ReportData reportData = new ReportData();
reportData.add(EnumKeys.CONSUMERID,"123");

呼叫者 2 报告消费者 ID

报告数据 reportData = new ReportData(); reportData.add(EnumKeys.CONSUMERID,"435");

来电 3 报告不常用的 XYZ 键

//First create a custom KEY
public enum CustomEnum implements Key{

XYZ("xyz");
}

ReportData reportData = new ReportData();
reportData.add(CustomEnum.XYZ,"custom value");

最终框架会将每个属性键对转换为 JSON

ObjectMapper mapper = new ObjectMapper().writeValueAsString(reportData);

输出

  1. 并非所有调用者都需要创建持有者类(相当于 ReportData)来持有属性。
  2. 使用 ReportData 的实例,它们可以使 KEY 使用相同的 KEY 名称保持一致性
  3. 调用者可以扩展 EnumKeys(KEY 的主列表)并定义自己的键,并且仍然可以使用相同的报告方式。

问题

  1. 这种使用方式有什么不好的地方吗?
  2. 从 HashMap/EnumMap 实例化对象 (ReportData) 有什么不好的吗?
  3. 对象(带有实例成员)是否更适合生成 JSON 或 HASHMAP 更受约束的 KEY NAME 更好?最终目的地是 JSON。
  4. 使用现有类(具有 n 个属性)和与 ReportData 类一起使用的任何简单方法。

感谢任何输入。

【问题讨论】:

    标签: json enums hashmap


    【解决方案1】:

    如果您事先了解数据结构,我肯定会选择对象方法,因为它为您提供键值对的类型安全性。

    使用 hashmap 可以让事情变得更加动态,但你会失去类型安全性。

    想想 json 中的 string vs int vs float vs bool,以及如何在代码中使用 hashmap 和 object。

    考虑可读性、灵活性和转换需求。

    【讨论】:

    • Think string vs int vs float vs bool in json 这是我所暗示的问题的一部分。
    • 我知道数据结构和几个键(如平台键),我可以强制所有人使用相同的键,但我不知道扩展键(用户定义的键)是什么,我试图找到如何我可以在他们定义和使用密钥时强制执行完整性/一致性吗
    猜你喜欢
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多