eftec/services_json

PHP实现json_encode/decode

2.4 2024-04-06 15:37 UTC

This package is auto-updated.

Last update: 2024-09-06 16:53:04 UTC


README

PHP 7.2及以上版本的json_encode/decode实现。这个库可以与带引号的键和无引号的键一起工作。

Packagist Total Downloads Maintenance composer php php CocoaPods

此包提供对JSON表示法的简单编码器和解码器。它旨在与使用HTTPRequest进行服务器通信函数的客户端JavaScript应用程序一起使用 - 数据可以编码为JSON表示法,用于客户端JavaScript,或从传入的JavaScript请求中解码。JSON格式是JavaScript的本地格式,可以直接使用eval()进行评估,无需额外的解析开销。

那么,这个版本的目标是什么?

虽然这个版本的性能并不优于作为扩展提供的json_encode()和json_decode(),但它具有以下特性

  • 它不需要扩展。如果您无法安装ext-json,则可以使用此版本。
  • 它支持无引号键的JSON(例如JavaScript表示法),{aaa:2,bbb:"hello"}
  • 它还可以支持无引号值 {"aaa":2,"bbb":hello}
  • 它还可以支持未包裹的内容 "aaa":2,"bbb":"hello" 而不是 {aaa:2,bbb:"hello"}
  • 这是一个简单的.php文件,没有依赖。

用法

使用composer开始

  1. 使用composer安装库
composer require eftec/services_json
  1. 包含依赖项
use eftec\ServicesJson\Services_JSON;
include '../vendor/autoload.php';

查看文件夹examples以获取更多示例

不使用composer开始

  1. 复制此文件:Services_JSON/Services_JSON.php

  2. 包含文件

    use eftec\ServicesJson\Services_JSON;
    include 'Services_JSON.php'; // or where is located the file.

解码

将JSON字符串解码为stdclass或关联数组

$json='{"hello":{"a":2,"b":3},"world":[1,2,3,"aaa"]}';
var_dump(Services_JSON::decode($json)); // as stdclass
var_dump(Services_JSON::decode($json,Services_JSON::GET_ARRAY)); // as array

它也支持无引号键

$json='{hello:{a:2,b:3},world:[1,2,3,"aaa","bbbb"]}';  // the keys are unquoted.
var_dump(Services_JSON::decode($json)); // as stdclass
var_dump(Services_JSON::decode($json,Services_JSON::GET_ARRAY)); // as array

JSON未包裹。

使用标志Services_JSON::DECODE_FIX_ROOT,如果原始文本在代码开始处缺少[]和{},它也可以工作。注意,此功能并非万无一失,例如"[1,2,3],[4,5,6]"将不会包裹为"[[1,2,3],[4,5,6]]"。

{"a":222,"b:"ccc"}  # normal json
"a":222,"b:"ccc"    # json without the root parenthesis.    
Services_JSON::decode('1,2,3',Services_JSON::GET_ARRAY | Services_JSON::DECODE_FIX_ROOT); // returns [1,2,3]
Services_JSON::decode('"k1":"v1", k2:2',Services_JSON::GET_ARRAY | Services_JSON::DECODE_FIX_ROOT) // returns [ 'k1' => 'v1','k2'=>2]

注意:DECODE_FIX_ROOT标志检测靠近的字符是否为":"或","。如果最近的字符是":",则返回一个对象,否则返回一个列表。如果没有,则返回一个列表。

具有无引号值的JSON

使用标志Services_JSON::DECODE_NO_QUOTE,它还可以在字符串值未引号时工作。

注意:开头和结尾处的不可见字符(制表符、换行符)将被删除。

Services_JSON::decode('{"a":aaa,"b":bbbb,"c": aaaaa}'
  , Services_JSON::GET_ARRAY | Services_JSON::DECODE_NO_QUOTE) // ['a'=>'aaa','b'=>'bbbb','c' => 'aaaaa']

编码

将值(数组、对象、原始值等)转换为JSON表达式(字符串)

$array=["hello"=>['a'=>2,'b'=>3],'world'=>[1,2,3,"aaa","bbb"]];
$obj=(object)$array;
var_dump(Services_JSON::encode($array));  // encode an associative array
var_dump(Services_JSON::encode($obj)); // encode an object

变更日志

  • 2.4
    • 更新要求至php 7.4
    • 添加更多类型提示(类型验证)
  • 2.3.2
    • 添加了decode()的标志DECODE_NO_QUOTE
  • 2.3.1
    • 删除了未使用的代码
    • 修复了注释。
    • 代码的25%已被重构。
  • 2.3
    • 修复了注释中的错别字。
    • 添加了phpunit。整个代码都已测试,但特殊编码。
  • 2.2
    • 现在库是静态的,因此可以调用方法而无需创建实例。
    • 如果您想使用非静态库,则安装1.1
  • 1.1
    • 它与PHP 7.2及以上版本(包括PHP 8.0和8.1)兼容
    • 它不需要PECL即可工作。
    • 代码已清理
    • 删除了Web头部。
    • decode()方法可以返回关联数组。
  • 1.0.3-1.0.0 PECL版本。它仅适用于PHP 4.x和PHP 5.x