V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zzlit
V2EX  ›  程序员

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

  •  
  •   zzlit · 36 天前 · 3274 次点击
    这是一个创建于 36 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

    比如
    {'foo': 'bar'}

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

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

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