• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zzlit
V2EX  ›  程序员

JSON 字符串如何转换为短链接

  •  
  •   zzlit · Nov 12, 2024 · 5220 views
    This topic created in 732 days ago, the information mentioned may be changed or developed.

    例如有一串很长的 JSON 字符串 '{"x":5,"y":6}' ,我想转为短链,并且拿到短链的还能反编译为原值。考虑了几个压缩的库发现字符串长度并不会更短,甚至还会更长。

    那其实应该是需要先进行把能精简长度的尽量精简,比如 key ,然后再进行一定的规则转为短链而不是单纯的压缩,有大佬能谈一下这个转换的规则吗? JavaScript 库或者算法都可以。

    另外我了解现在的短链大部分是有服务端参与存储在数据库里面的,但是有无纯前端的方案呢?

    Supplement 1  ·  Nov 12, 2024
    非常感谢各位大佬的回复,有些困扰我的问题在回复中也能理解了一点。确实是有点巧妇难为无米之炊的感觉,还得再想想办法。
    Supplement 2  ·  Nov 12, 2024
    为什么会有这个问题是因为打羽毛球想到的一个轮转对局的算法,我写出来了但是只能我自己“单机”看,所以就想到有没有这种途径,我把对局信息处理为短链,然后发给大家,大家可以进行反编译再拿到对局信息
    54 replies  •  2024-11-13 17:39:05 +08:00
    Sezxy
    Sezxy
    Nov 12, 2024
    1
    短链接 跟 字符串压缩没事关系吧?
    zzlit
    zzlit
    OP
    Nov 12, 2024
    2
    @Goooooos 对,我本来是往压缩方向想,结果发现错了,根本就不对
    b821025551b
    b821025551b
    Nov 12, 2024
    3
    你在说神马?
    shintendo
    shintendo
    Nov 12, 2024
    4
    额,你难道认为短链是把长链压缩出来的吗
    zzlit
    zzlit
    OP
    Nov 12, 2024
    5
    @b821025551b 就是比如我想对这个字符串 '{"x":5,"y":6}' 变成 'xxxx', 然后 'xxxx' 还能还原为'{"x":5,"y":6}',长度尽可能短,所以用了短链的概念
    zzlit
    zzlit
    OP
    Nov 12, 2024
    6
    @shintendo 之前是这样想的,后面发现概念错了...
    meeop
    meeop
    Nov 12, 2024
    7
    没有

    数据可以压缩,但不会有魔法般的将任何信息变成一个固定长度 key 的方法

    但是你可以将数据上传任何 cdn ,然后会得到一个固定长度下载链接
    shintendo
    shintendo
    Nov 12, 2024❤️2
    9
    如果你这个 JSON 是完全任意内容,而不是固定的 pattern ,或者大量重复的 key 的话,很难想象能怎么压缩。
    退一步想想,如果有这么一个稳定无损缩短 JSON 的算法,现在的前后端 ajax 通信为啥不用上呢?要不你看看 gzip 吧
    DigitaIOcean
    DigitaIOcean
    Nov 12, 2024
    10
    @zzlit #6 哈哈哈哈
    nzynzynzy
    nzynzynzy
    Nov 12, 2024
    11
    传输和存储是两件事,我有点没弄清楚你要传输方便还是要存储到一个地方然后访问?
    miaotaizi
    miaotaizi
    Nov 12, 2024
    12
    布隆过滤器?
    iorilu
    iorilu
    Nov 12, 2024
    13
    压缩是压缩
    短链是短链

    难道你认为短链可以做到压缩得功能

    要真有让 json 压缩并能还原, 那任何地方不都能用上
    zzlit
    zzlit
    OP
    Nov 12, 2024
    14
    @nzynzynzy 传输方便,存储的话得上服务了吧
    COW
    COW
    Nov 12, 2024 via Android
    15
    其实就是想把一个 id 映射到 json 字符串呗,那只要你做了 kv 存储,就能相互转换,至于短链长什么样跟你的 id 生成规则有关
    cheng6563
    cheng6563
    Nov 12, 2024❤️2
    16
    先 urlencode 下,{"x":5,"y":6 转成 %7B%22x%22%3A5%2C%22y%22%3A6%7D

    然后随便做个 url https://example.com/?json=%7B%22x%22%3A5%2C%22y%22%3A6%7D

    把这个 url 随便发个微博,把微博生成的短链接复制出来
    nzynzynzy
    nzynzynzy
    Nov 12, 2024
    17
    @zzlit #14 传输就最多是 minify (去掉空格)就到头了吧,我感觉是这样了。如果 A-->B 传输就这样了。如果能,就精简一下 json 的内容,荣誉的东西不要。
    我感觉很多开发时候 json 都是脱裤级别的存在,不要这样,要精简,一次数据太多要翻页。
    otakustay
    otakustay
    Nov 12, 2024
    18
    先按 UTF8 编码走 gzip (或者其它任意压缩算法)一下,然后再转成 hex (或者其它更高效的表达)?
    penisulaS
    penisulaS
    Nov 12, 2024
    19
    其实就是需要按照你的业务特性,设计一种高效的数据编码/解码算法
    hoythan
    hoythan
    PRO
    Nov 12, 2024
    20
    @cheng6563 你可真是个人才!
    zzlit
    zzlit
    OP
    Nov 12, 2024
    21
    @kzfile 对的,我就是没有想好这种算法怎么设计好,想问问大家
    zzlit
    zzlit
    OP
    Nov 12, 2024
    22
    @cheng6563 曲线救国了~
    siweipancc
    siweipancc
    Nov 12, 2024 via iPhone
    23
    害怕……哪有这么玩的
    QingXuJiaZhi
    QingXuJiaZhi
    Nov 12, 2024
    24
    感觉是个 XY 问题,建议说出最终是想做什么。
    systemGuest
    systemGuest
    Nov 12, 2024
    25
    @meeop MD5:你在讲什么?
    systemGuest
    systemGuest
    Nov 12, 2024
    26
    数据库设计个表 id(自增 ID),md5(唯一索引),json(实际内容) 3 个字段
    假如 json={"x":5,"y":6} ,md5 就是 {"x":5,"y":6}=225a399a7b45045f ,如果这个 md5 不存在就把 md5 和 json 内容写到表里,返回了自增 ID 1 ,你可以生成短连接 url/1 ,用户访问这个短连接 你也可以通过携带的 1 反查自增 id=1 json 内容
    ixcode
    ixcode
    Nov 12, 2024
    27
    你的需求是数据压缩,短链接是一个 a->b 的映射。
    json 本身不是一个高效率的格式,他的优点是可读性好。光看那些引号就知道有多浪费空间了。
    MoYi123
    MoYi123
    Nov 12, 2024
    28
    请学习数论入门课题之抽屉原理(说难听点是小学奥数的内容)
    0o0o0o0
    0o0o0o0
    Nov 12, 2024
    29
    短链 反编译(我理解为解码)
    说明你是要拿到这个 url 走自己的程序解码,并且尽可能看起来短
    那直接用 https://example.com/[所有编码内容]
    编码的字符直接用除了 [url 保留字符] 的所有其他字符就好了。
    hex 是 16 进制,你完全可用 0-9 a-z A-Z -_.~ 做一个 66 进制。
    再大胆一点,利用常用汉字做个 2048 进制,虽然汉字实际存储占用很大,但是看起来短就行。
    ink19
    ink19
    Nov 12, 2024
    30
    @systemGuest #25 md5 是摘要算法,损失了数据的
    SilentRhythm
    SilentRhythm
    Nov 12, 2024
    31
    1. 字典表
    2. 网络传输考虑 protobuf 或 gzip
    3. 如果是简单对象,可以考虑 url query string ,如 x=5&y=6 ,有一定可读性
    0o0o0o0
    0o0o0o0
    Nov 12, 2024
    32
    @0o0o0o0 想错了,常用汉字可以做 4096 进制,也就是 12 位二进制作为一个汉字,但是汉字是全角字符,视觉上占用两个半角字符,“压缩比”大概是 6.
    如果是 url 非保留字符 可以 64 进制,也就是 6 位二进制作为一个字符,所以还是用 0-9 a-z A-Z -_.~ 做一个 64 进制的就好了。
    用 hex 的话是 4 位二进制作为一个字符,用 url 非保留字符相比 hex 可以缩短 1/3
    0o0o0o0
    0o0o0o0
    Nov 12, 2024
    33
    “考虑了几个压缩的库发现字符串长度并不会更短,甚至还会更长。”
    是因为即使是 ascii 范围的字符也有 128 个,而转成 hex 之后,hex 只有 16 个字符,相当于你压缩完只有原来的 1/8 大小才能不变短。
    0o0o0o0
    0o0o0o0
    Nov 12, 2024
    34
    @0o0o0o0 不变长,说错了
    darkengine
    darkengine
    Nov 12, 2024
    35
    信息论的东西
    frankly123
    frankly123
    Nov 12, 2024
    36
    JOSN 文件,往 CDN 传,文件名拼接到链接上
    molvqingtai
    molvqingtai
    Nov 12, 2024
    37
    @zzlit @perfsee/jsonr 这个包能压缩 JSON ,原理是提取重复的 JSON 字符
    JShen
    JShen
    Nov 12, 2024
    38
    @systemGuest #26 你这个有漏洞的,最好还是返回 md5 ,因为 id 会让人爬完。并且无法应对大量的短链。后续分表不好使
    InkAndBanner
    InkAndBanner
    Nov 12, 2024
    39
    如果真能实现 ,恭喜你发现了世界上最先进的压缩算法
    jydeng
    jydeng
    Nov 12, 2024
    40
    你可以搜一下 lz-string ,但也不可能压缩成短链。
    niubilewodev
    niubilewodev
    Nov 12, 2024 via iPhone
    41
    XY 问题,说出你的真实需求。
    tf2
    tf2
    Nov 12, 2024
    42
    如果 json 结构很杂乱,纯粹为了节省 URL 空间,那么 kibana 那套方案可以参考下

    https://github.com/betodealmeida/python-rison

    比如
    {'foo': 'bar'}

    压缩后:
    (foo:bar)
    vkZudze5p1h4py5H
    vkZudze5p1h4py5H
    Nov 12, 2024
    43
    做个数据库呗,json 存数据库里,返回 id 。
    nzynzynzy
    nzynzynzy
    Nov 12, 2024
    44
    @cheng6563 #16 作为开发和用户,对存储压力毫无感知,方案很不错
    opengps
    opengps
    Nov 12, 2024
    45
    要知道,json 的诞生是由 xml 驱动的,所以要是有更短的格式肯定不会是现在的 2 局面
    zzlit
    zzlit
    OP
    Nov 12, 2024
    46
    @cmdOptionKana
    @niubilewodev 多谢大佬的回复,我需求就是脱离服务端的存储,从前端进行数据传递,是因为打羽毛想到的一个轮转对局的算法,我写出来了但是只能我自己“单机”看,所以就想到有没有这种途径,我把对局信息处理为短链,然后发给大家,大家可以进行反编译拿到对局信息,至于反编译的工具或者说平台就很简单了,现在就是卡在处理数据这一步
    zzlit
    zzlit
    OP
    Nov 12, 2024
    47
    @0o0o0o0 受教了
    QingXuJiaZhi
    QingXuJiaZhi
    Nov 12, 2024
    48
    @zzlit

    > 把对局信息处理为短链,然后发给大家

    这一步,是通过什么方式发送?
    QingXuJiaZhi
    QingXuJiaZhi
    Nov 12, 2024
    49
    感觉你可以通过网盘之类的方式,直接分享文件。或者索性直接自己建个网站算了,没有自己的服务器,很多事情都束手束脚。
    systemGuest
    systemGuest
    Nov 13, 2024
    50
    @ink19
    @JShen
    结合需求看问题,我的理解他已经确定了 json 内容,但是业务上通过 json 传输很不方便,那就 key=>value 对应转换下结束, 没那么多要求。
    shanai
    shanai
    Nov 13, 2024
    51
    搜索下 CJSON 、HPACK
    junwind
    junwind
    Nov 13, 2024
    52
    自己定义一套字典呗, 比如 a 表示 xxx ,b 表示 yyy ,然后把这套字典交给要解析的对方。
    ink19
    ink19
    Nov 13, 2024
    53
    @systemGuest #50 如果你返回的 id ,那为啥还需要保存 md5 呢?我比较同意 JShen 的说法,如果你要使用一个 key ,最好就是用散列的 key ,可以防爬,比如 b 站的 bv 号。
    JShen
    JShen
    Nov 13, 2024
    54
    @systemGuest #50 这里很多不明确的需求,数据量有多大?后续 json 会不会变?你直接一个 md5 我没看懂,md5 数据相当于没办法恢复了,返回 ID 的做法不太符合互联网的常规做法,美团的订单号不是顺序的,淘宝也不是,就是防止在订单上被人爬取。这些都是要考虑的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1875 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 93ms · UTC 11:53 · PVG 19:53 · LAX 03:53 · JFK 06:53
    ♥ Do have faith in what you're doing.