Php JSON对象regex&;合并
我使用正则表达式从VDF(阀门数据格式)转换JSON字符串,如下所示:Php JSON对象regex&;合并,php,regex,json,Php,Regex,Json,我使用正则表达式从VDF(阀门数据格式)转换JSON字符串,如下所示: {"items_game": { "prefabs": { ... "coupon_crate_prefab": { "prefab": "weapon_case_base", "item_type": "coupon_crate", "attributes": { "cannot
{"items_game": {
"prefabs": {
...
"coupon_crate_prefab": {
"prefab": "weapon_case_base",
"item_type": "coupon_crate",
"attributes": {
"cannot trade": "1"
},
"capabilities": {
"can_delete": "0"
},
"attributes": {
"expiration date": {
"attribute_class": "expiration_date",
"force_gc_to_generate": "1",
"use_custom_logic": "expiration_period_days_from_now",
"value": "2"
}
}
},
"coupon_key_prefab": {
"prefab": "csgo_tool",
"item_type": "coupon_key",
"attributes": {
"cannot trade": "1"
},
"capabilities": {
"can_delete": "0"
},
"attributes": {
"expiration date": {
"attribute_class": "expiration_date",
"force_gc_to_generate": "1",
"use_custom_logic": "expiration_period_days_from_now",
"value": "2"
}
}
}
...
}
}
通缉结果:
"coupon_key_prefab": {
"prefab": "csgo_tool",
"item_type": "coupon_key",
"attributes": {
"cannot trade": "1",
"expiration date": {
"attribute_class": "expiration_date",
"force_gc_to_generate": "1",
"use_custom_logic": "expiration_period_days_from_now",
"value": "2"
}
},
"capabilities": {
"can_delete": "0"
}
}
正如您所看到的,有重复的属性
,我需要合并它们,因为这在JSON中无效。我该怎么做?(可能使用preg_replace)使用regex执行此操作是一个非常糟糕的主意,因为JSON是一种数据结构,可以通过多种方式格式化,并执行嵌套等操作 这使得使用正则表达式进行解析不是一个好主意,因为如果这样做,最多只能创建脆弱的代码 但我也不确定这样做的有效性——如果您通过验证器运行JSON,重复的密钥会相互覆盖
use strict;
use warnings;
use JSON;
local $/;
print to_json ( from_json ( <DATA>) , { pretty => 1 } );
__DATA__
{
"items_game": {
"prefabs": {
"coupon_crate_prefab": {
"prefab": "weapon_case_base",
"item_type": "coupon_crate",
"attributes": {
"cannot trade": "1"
},
"capabilities": {
"can_delete": "0"
},
"attributes": {
"expiration date": {
"attribute_class": "expiration_date",
"force_gc_to_generate": "1",
"use_custom_logic": "expiration_period_days_from_now",
"value": "2"
}
}
}
}
}
}
使用严格;
使用警告;
使用JSON;
本地$/;
打印到_json(从_json(),{pretty=>1});
__资料__
{
“物品与游戏”:{
“预制件”:{
“挂片板条箱预制件”:{
“预制”:“武器、箱子、底座”,
“项目类型”:“优惠券板条箱”,
“属性”:{
“无法交易”:“1”
},
“能力”:{
无法删除“:“0”
},
“属性”:{
“到期日”:{
“属性类”:“到期日”,
“强制生成”:“1”,
“使用自定义逻辑”:“从现在起到期日”,
“值”:“2”
}
}
}
}
}
}
这将解析您的JSON,我希望我已经修复了它以匹配您的源代码-请注意,它是您数据的“被删除”部分。我认为这是大多数解析库中的常见行为。因此,这实际上可能意味着你的“事情”正在以同样的方式“处理”
因此,很难给你一个明确的答案,什么是最好的解决办法。理想情况下,您可以使用JSON解析器,但您所做的并不是JSON规范中定义的,因此您将得到可变的结果
编辑:下面是注释-看起来VDF类似于JSON,但并不完全相同
我仍然不会使用正则表达式,但可以尝试递归解析。关闭{
并“传递”类似于JSON的内容,这样就可以得到一个命名键值对的底部分支,然后可以对其进行哈希化
如果仍然没有更好的答案,我可能会在稍后编写一个perl示例(对不起,现在没有时间)
您可能会在此处找到可以使用的内容:
但这可能也是为什么不使用regex的一个很好的例子:)使用regex这样做是一个非常糟糕的主意,因为JSON是一种可以通过多种方式格式化的数据结构,可以执行嵌套等操作 这使得使用正则表达式进行解析不是一个好主意,因为如果这样做,最多只能创建脆弱的代码 但我也不确定这样做的有效性——如果您通过验证器运行JSON,重复的密钥会相互覆盖
use strict;
use warnings;
use JSON;
local $/;
print to_json ( from_json ( <DATA>) , { pretty => 1 } );
__DATA__
{
"items_game": {
"prefabs": {
"coupon_crate_prefab": {
"prefab": "weapon_case_base",
"item_type": "coupon_crate",
"attributes": {
"cannot trade": "1"
},
"capabilities": {
"can_delete": "0"
},
"attributes": {
"expiration date": {
"attribute_class": "expiration_date",
"force_gc_to_generate": "1",
"use_custom_logic": "expiration_period_days_from_now",
"value": "2"
}
}
}
}
}
}
使用严格;
使用警告;
使用JSON;
本地$/;
打印到_json(从_json(),{pretty=>1});
__资料__
{
“物品与游戏”:{
“预制件”:{
“挂片板条箱预制件”:{
“预制”:“武器、箱子、底座”,
“项目类型”:“优惠券板条箱”,
“属性”:{
“无法交易”:“1”
},
“能力”:{
无法删除“:“0”
},
“属性”:{
“到期日”:{
“属性类”:“到期日”,
“强制生成”:“1”,
“使用自定义逻辑”:“从现在起到期日”,
“值”:“2”
}
}
}
}
}
}
这将解析您的JSON,我希望我已经修复了它以匹配您的源代码-请注意,它是您数据的“被删除”部分。我认为这是大多数解析库中的常见行为。因此,这可能实际上意味着您的“东西”正以相同的方式被“处理”
因此,很难给你一个明确的答案来说明什么是最好的方法。理想情况下,你会使用JSON解析器,但你所做的事情并没有在JSON规范中定义,因此你会得到不同的结果
编辑:下面是注释-看起来VDF类似于JSON,但并不完全相同
我仍然不会使用正则表达式,但可能会尝试递归解析。将其键入{
并“传递”类似JSON的内容,这样您就可以得到一个命名键值对的底部分支,然后进行哈希化
如果仍然没有更好的答案,我可能会在稍后编写一个perl示例(对不起,现在没有时间)
您可能会在此处找到可以使用的内容:
但这可能也是为什么不使用regex的一个很好的例子:)使用regex这样做是一个非常糟糕的主意,因为JSON是一种可以通过多种方式格式化的数据结构,可以执行嵌套等操作 这使得使用正则表达式进行解析不是一个好主意,因为如果这样做,最多只能创建脆弱的代码 但我也不确定这样做的有效性——如果您通过验证器运行JSON,重复的密钥会相互覆盖
use strict;
use warnings;
use JSON;
local $/;
print to_json ( from_json ( <DATA>) , { pretty => 1 } );
__DATA__
{
"items_game": {
"prefabs": {
"coupon_crate_prefab": {
"prefab": "weapon_case_base",
"item_type": "coupon_crate",
"attributes": {
"cannot trade": "1"
},
"capabilities": {
"can_delete": "0"
},
"attributes": {
"expiration date": {
"attribute_class": "expiration_date",
"force_gc_to_generate": "1",
"use_custom_logic": "expiration_period_days_from_now",
"value": "2"
}
}
}
}
}
}
使用严格;
使用警告;
使用JSON;
本地$/;
打印到_json(从_json(),{pretty=>1});
__资料__
{
“物品与游戏”:{
“预制件”:{
“挂片板条箱预制件”:{
“预制”:“武器、箱子、底座”,
“项目类型”:“优惠券板条箱”,
“属性”:{
“无法交易”:“1”
},
“能力”:{
无法删除“:“0”
},
“属性”:{
“到期日”:{
“属性类”:“到期日”,