【问题标题】:JSON Data - Validate Properties in PHPJSON 数据 - 在 PHP 中验证属性
【发布时间】:2017-07-07 09:13:52
【问题描述】:

我正在尝试针对大型 JSON 数据验证简单架构。我只需要查找我在 PHP 代码中使用的属性是否存在于 JSON 数据中。我查看了几个库,但它们似乎有点矫枉过正,因为它们甚至可以验证数据类型,而我只需要属性的存在。

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

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

所以 JSON 中可能会有额外的数据。

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

【问题讨论】:

    标签: php json schema


    【解决方案1】:

    如果您只需要验证简单架构中的密钥是否存在,您可以使用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 数据中。

    【讨论】:

    • @Don't Panic 这是一个绝妙的解决方案。我看到的唯一缺点是区分大小写。无论如何要麻木不仁?
    • 可以不区分大小写,但我认为使用 array_diff_key 是不可能的。您可能需要循环并将两个键转换为常见情况。如果您知道大数据中的所有键都属于某种情况,则可以事先将简单模式键转换为该情况。
    【解决方案2】:

    所以加上不区分大小写:

    $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() 表示所有属性都存在

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      相关资源
      最近更新 更多