java - Java 中字符串转换的简单属性

标签 java string encoding

使用 Java,我需要对名称值对的 Map 进行编码以存储到 String 中,并能够再次对其进行解码。这些将存储在数据库列中,并且可能通常很短且简单,因此常见情况应该产生一个简单美观的行,但不应破坏数据,即使它包含意外字符等也是如此。

你会如何选择这样做:

  • 编码形式是单一的、人类可读的行
  • 编码/解码不需要大库或很多上下文
  • 任何定界符都被正确转义

网址编码? JSON?自己做?请指定您要使用的任何帮助程序库或方法。

(根据要求进行编辑以指定更多上下文和要求。)

最佳答案

正如@Uri 所说,额外的上下文会很好。我认为您主要关心的不是特定的编码方案,因为对于简单的 Map<String, String> 来说,为大多数编码滚动您自己的方案非常容易。 .

一个有趣的问题是:这个中间字符串编码有什么用?

  • 如果它纯粹是内部的,一个特别的格式就很好,例如简单的连接:

    key1|value1|key2|value2
    
  • 如果人类晚上阅读它,像 Ruby 的 map 声明这样的格式是不错的:

    { first_key  => first_value, 
      second_key => second_value }
    
  • 如果编码是通过网络将序列化 map 发送到另一个应用程序,那么 XML 建议很有意义,因为它是标准的并且合理地 self 记录,代价是 XML 的冗长。

    <map>
        <entry key='foo' value='bar'/>
        <entry key='this' value='that'/>
    </map>
    
  • 如果 map 将被刷新到文件并稍后由另一个 Java 应用程序读回,@Cletus 对 Properties class 的建议是一个很好的,并且具有易于打开和检查的额外好处。


编辑:您已经添加了要存储在数据库列中的信息 - 是否有理由使用单列而不是像这样的三列:

CREATE TABLE StringMaps 
(
    map_id NUMBER   NOT NULL,  -- ditch this if you only store one map...
    key    VARCHAR2 NOT NULL,
    value  VARCHAR2
);

除了让您存储更具语义意义的数据外,这还将编码/解码更正式地移至您的数据访问层,并允许其他数据库读者轻松查看数据,而无需了解您可能使用的任何自定义编码方案。如果需要,您还可以轻松地按键或值进行查询。


再次编辑:您已经说过它确实需要放入一个列中,在这种情况下我会:

  • 使用第一个管道分隔的编码(或您喜欢的任何奇异字符,可能是一些无法打印的英文 unicode 字符)。最简单的东西。或者……

  • 如果您使用像 Oracle 这样的数据库将 XML 识别为真实类型(因此可以为您提供针对它的 XPath 评估等)并且需要能够很好地从数据库层读取数据, 使用 XML。编写用于解码的 XML 解析器从来都不是一件有趣的事,但对于这样一个简单的架构,应该不会太痛苦。

即使您的数据库本身不支持 XML,您也可以将其放入任何旧的类似字符的列类型中...

关于java - Java 中字符串转换的简单属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/370004/

相关文章:

java - 使用 java 的持久本地 tty session

java - 为什么我的应用程序在尝试从 Firebase 检索数据时崩溃?

c - 指针与 c 中的整数二维数组和字符串不同

java - 有关Java死锁情况的问题

java - 多行标题不起作用。

c# - 将一个字符串值映射到另一个字符串值的优雅解决方案

string - 如何计算 f# 中字符串中的元音字母

c++ - ffmpeg API编码mpeg-4 Windows Media Player错误

java - 将 HTML 文件的 byte[] 转换为 String

bash - 使用 Base 64 编码字符串在 shell 脚本中返回空或 null