V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zzlit
V2EX  ›  程序员

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

  •  
  •   zzlit · 2 天前 · 2845 次点击

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

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

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

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

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

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

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

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

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

    比如
    {'foo': 'bar'}

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

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

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