2017-02-17 55 views
0

我试图验证一个简单的模式对大型JSON数据。我只需要找到我的PHP代码中使用的属性是否存在于JSON数据中。我已经看过几个库,但它们看起来过于矫枉过正,因为它们甚至验证了数据类型,我只需要存在属性。JSON数据 - 验证PHP中的属性

例如: PHP变量使用:name, age, gender JSON数据:

{ 
    "Location": "10.2.00", 
    "Name": "Foo", 
    "Age": "30", 
    "Race": "NA", 
    "Gender": "Male" 
} 

因此,有可能是JSON额外数据。

如何检查我的PHP代码或其他JSON模式中是否存在JSON变量?

回答

0

如果您只需验证简单模式中的密钥是否存在,则可以使用array_diff_key

定义的简单模式(请记住,键是区分大小写的。)

$simple_schema = ['Name', 'Age', 'Gender']; 

解码你的大JSON数据(一定要使用的json_decode第二个参数,以获得比较数组)。

$json = json_decode($large_json_data, true); 

然后使用array_diff_key获得差异。

$missing_keys = array_diff_key(array_flip($simple_schema), $json); 

array_flip将简单模式的值转换为用于比较的键。

如果$missing_keys为空,那么架构中的所有键都存在于大JSON数据中。

+0

@不要惊慌这是一个美丽的解决方案。唯一不利的一面是我看到的是区分大小写。无论如何,使不敏感? – user3704920

+0

它可以做到不区分大小写,但我认为这不可能与array_diff_key。您可能需要循环并将这两个键转换为常见的情况。如果您知道大数据中的所有密钥都处于特定情况下,则可以事先将简单模式密钥转换为该情况。 –

0
与相加的情况下不敏感的

所以:

$props = array('name', 'age', 'gender'); 
$array = array_map('strtolower', array_keys(json_decode($json, true))); 

if(empty(array_diff($props, $array))) { 
    echo "All properties exist"; 
} 
  • 使用小写的属性名称的数组
  • 获取从JSON键和映射到strtolower()
  • 检查的区别是empty()这意味着所有属性