【问题标题】:Java storing type information along with Byte[] array from toBytesJava 将类型信息与来自 toBytes 的 Byte[] 数组一起存储
【发布时间】:2016-02-09 11:07:54
【问题描述】:

我将 JSON 信息存储在数据库中,我想在存储之前将所有值转换为字节,但保留类型信息。

所以,对于 String、Integer 和 Boolean 类型,我想说:

Byte[] bytes = toBytes(myStr);

// Not too sure about this part... 
// Want type information to be retrieved somehow.
String s = fromBytes(bytes);

在 Java 中最好的方法是什么?

This 问题涉及将具有任意内容的字符串序列化为字节数组。我的问题涉及如何在不丢失类型信息的情况下序列化任意 JSON 类型。

【问题讨论】:

  • 你看过gson库吗? github.com/google/gson
  • 据我了解,这实际上并不是询问如何将任意字符串反序列化为字节数组的重复。不过,欢迎您解释为什么您不这么认为!
  • 看起来 gson 不会让我反序列化未知类型。所有电话都必须来自gson.fromJson("1", int.class);。来自 gson 文档:“但是,使用 fromJson(json, Collection.class) 进行反序列化将不起作用,因为 Gson 无法知道如何将输入映射到类型。Gson 要求您在 fromJson 中提供集合类型的通用版本. "

标签: java json encoding


【解决方案1】:

您可以这样做的一种方法是将一个字符附加到字符串的末尾,作为类型的“代码”。

例如,您可以为String 添加s,为Integer 添加i,为Float 添加f,等等...

当您将其解析为 String 时,您可以删除并检索最后一个字符,然后将其相应地更改为正确的形式。

例如:

// encoding
Byte[] bytes = toBytes(myStr + "s");

// decoding
String s = fromBytes(bytes);
String type = s.substring(s.length()-2);
s = s.substring(0, s.length()-1);
switch(s) {
    case "s":
        // leave it as is - already a string
        break;
    case "i":
        // convert it to integer
        // ... and so on
}

【讨论】:

  • @EleazarEnrique 但这是一个很容易可逆的操作,您不必在 JSON 中添加其他字段。
【解决方案2】:

我认为您必须在 JSON 中添加一个对象字段来识别类型。比如“type”:“integer”或者“type”:“String”等等。

我看不到其他方式。

【讨论】:

  • JSON 中没有“标签”,只有对象字段。
猜你喜欢
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2020-10-05
相关资源
最近更新 更多