是不是能统一一下配置文件中的 null,none,None 和 “”
Justsoos opened this issue · comments
最近在写个小脚本,处理 config.json 和 guiNConfig.json ,后者是 v2rayN 使用的。
发现 v2rayN 大量使用"none"
这种不规范的 json 取值,变换导入v2ray 的 config.json 后,大部分变成规范的 null
。
但今天发现 v2ray 的配置文件里:['outbound']['streamSettings']['kcpSettings']['header']['type']
这个值也是可以取 “none”
,而不是 null
或者 “”
。
json 标准对“none”
值是按照 string 处理的,正规的 json 应该用 null
, python 内 json.loads 后对应为 None
,这样才有通用性。
不知道还有那个值也是这样取的?
建议从 v2ray 的 config.json 开始,能把这几个 “none”,none,”None“,“”,‘’,”null“
的值全部规范为 null
@2dust
null
是JSON规范,和V2Ray的配置无关,所有null的项你不写也都是可以的,一般这种情况都是使用生成器生成出来的附加内容。
V2Ray的官方文档中没有使用过任何除了"none"
之外的类似定义。
@DarienRaymond
虽然理论上如此,v2rayN 也不是 v2ray 的开发,算是个“生成器”,但实测,比如目前找到的这个,在config.json 里将
['outbound']['streamSettings']['kcpSettings']['header']['type'] 设置为“”
或者 null
都会出错
V2Ray v3.14 (die Commanderin) 20180316
An unified platform for anti-censorship.
failed to parse json config: Ext|Tools|Conf|Serial: failed to parse json config > Ext|Tools|Conf: Failed to build mKCP config. > Ext|Tools|Conf: invalid mKCP header config. > Ext|Tools|Conf: unknown config id:
Main: failed to read config file: C:\PATH\config.json > Main|Json: failed to execute v2ctl to convert config file. > exit status 4294967295
设置成 none
当然,也会出错。
V2Ray v3.14 (die Commanderin) 20180316
An unified platform for anti-censorship.
failed to parse json config: Ext|Tools|Conf|Serial: failed to read config file > invalid character 'o' in literal null (expecting 'u')
Main: failed to read config file: C:\PATH\config.json > Main|Json: failed to execute v2ctl to convert config file. > exit status 4294967295
目前偶然遇到出错才发现的这个 “none” 写法,确定是 v2ray-core 内置的,而不是 “生成器” 的逻辑。
由于 v2ray 设计,并不是一个类似 ssr,全部配置信息在 config.json 里都可以找到树结构的,所以,二次开发可能坑很多。来确认一下,这个树结构的标准。
至于 v2rayN ,还是希望 @2dust 能把 “none” 这样奇怪的写法,全都改成 null
这两个语义完全不同,不明白你为什么一定要强求 null
你真去作程序就懂了,加冒号的 “none”
,简直就是对程序员的一种嘲笑。
就算最低级情况下,要过滤出文本里不规范的,容易和关键字模糊的,“none” 也是个语义和形态,都非常可憎的写法。和 None,“none”,‘none’ 在多个编程语言里都有误会的机会。
实在不行,“” 也可以考虑,也比 “none” 要好,但我测了,“” 用在这个键值上,v2ray.exe报错,看楼上
另外,我也是刚接触 v2ray 不知道遇到这个坑之后,还有那些坑,你们要知道,和我说下。
如果我觉得可以,就提建议,大家商量。至少 v2rayN 里面到处用 “none” 是实在太可怕了。
这是比较严重的现实问题:
在 v2rayN 的 guiNConfig.json 里,关于三种协议,混用到了令人糊涂的地步:
"network": "tcp",
"headerType": "none",
而这个 “none” 代表的是 "outbound" -> "tcpSettings": null,
整个这数据树的一大支都没了
同时,如此混用:
"network": "ws",
"headerType": "none",
同一个 json 键值,代表的却是 "outbound" -> "wsSettings" -> "headers": null
而第三个,就是上面提到的,v2ray 始作俑的 “none”:
"network": "kcp",
"headerType": "none",
['outbound']['streamSettings']['kcpSettings']['header']['type'] -> “none”
我觉得, @2dust 在 v2rayN 混用 “none” 的不同语义根源就是来自这里,并不能仅仅说他用了账号生成器的问题。
即便那个账号生成器,何来 “none” 这样奇特的写法??
制作 v2ray 的配置文件解析器过程里,感觉,账号生成器为了 “凑合” 位置,把不同协议,不同功能键值,都写到一个 json 键值上,把不同语义 null,None,“”,“string” 混用,导致了这些错乱,根源,其实还在 v2ray-core。
ss, ssr 的配置文件是扁平的,uri 也简单粗放,所有数据都可以列在一个二层树上列出来,v2ray 则完全不同,即便 v2rayN 用一个二层树文件,凑合表达,造成不同语义复用键值,而且没有一个通用标准配置文件可用。
https://github.com/Justsoos/ss-ssr-v2ray-gadget/blob/cf35d7aaa695112e299ac2366a9d76491a1d56e4/check_v2ray.py#L143
这是我写 v2rayN -> v2ray 配置解析器遇到的问题,看看代码,好丑陋。没辙 ……
ws,tcp,kcp 三个协议互相排斥,导致分叉树都要自己搞一个模板… 再往上改某个值
也许你有更好的办法,教我。
如果你要设计客户端的话建议使用Pb格式的配置文件,其有更好的文件层级结构,
啥格式都不怕,但,不能脱离现实啊 -- 大量的消费者如果要用 v2rayN 和 v2ray-core 的 “none” ,我除非说服他们的开发者改掉,就算自己造一个客户端,也免不了被这些丑陋的数据吞噬。哈哈 @xiaokangwang 目前面临的就是这个问题吧。
@Justsoos 我的话并没有什么使用json格式的地方,我的Android客户端是没有编辑配置文件功能的。。。。。
至于网页版本的配制文件编辑器是将配置以json文件来理解的,并没有集成V2的特性