streaming json encoder

2025-12-07 0 870

streaming json encoder

streaming json encoder是一个PHP库,它提供了一组类,可以以流方式编码JSON,即允许您一点一点地对JSON文档进行编码,而不是一次编码整个文档。与内置的json_encode函数相比,有两个主要优点:

  • 例如,您无需将整个数据设置加载内存中,因为编码器支持在数组和任何类型的迭代器(例如生成器)上进行迭代。
  • 您无需将整个结果的JSON文档加载到内存中,因为JSON文档将按值编码值,并且可以按件输出编码的文档。

换句话说,当您需要处理可能占用过多的内存以处理的大型数据集时, streaming json encoder可以提供最大的好处。

为了增加互操作性,该库还提供了一个兼容的流,可与框架和HTTP请求一起使用。

API文档可在以下网址获得:http://violet.riimu.net/api/streaming-json-encoder/

要求

  • 最低支持的PHP版本为5.6
  • 该库取决于以下外部PHP库:
    • psr/http-message( ^1.0

安装

用作曲家安装

安装此库的最简单方法是使用作曲家来处理您的依赖项。为了通过作曲家安装此库,只需按照以下两个步骤操作:

  1. 通过在项目root中运行作曲家命令行安装来获取composer.phar

  2. 运行安装脚本后,您应该在项目root中有composer.phar文件,并且可以运行以下命令:

     php composer.phar require \"violet/streaming-json-encoder:^1.1\"
    

通过作曲家安装此库后,您可以通过包括由作曲家在安装过程中生成的vendor/autoload.php文件加载库。

将库添加为依赖关系

如果您已经熟悉如何使用Composer,则可以通过将以下composer.json文件添加到项目中并运行composer install命令来添加库作为依赖项:

{
    \"require\" : {
        \"violet/streaming-json-encoder\" : \" ^1.1 \"
    }
}

手动安装

如果您不希望使用作曲家加载库,则可以通过下载最新版本并将src文件夹提取到您的项目中来手动下载库。然后,您可以包括提供的src/autoload.php文件以加载库类。

请注意,使用作曲家还将自动下载其他必需的PHP库。如果您手动安装此库,则还需要使其他必需的库可用。

用法

该库提供了3种主要的不同方法,可以通过BufferJsonEncoderStreamJsonEncoder和PSR-7兼容流JsonStream使用库。

使用BufferJsonEncoder

当您需要以不涉及传递回调以处理生成的JSON的方式生成JSON文档时,缓冲区编码器最有用。

使用BufferJsonEncoder最简单方法是将其实例化使用JSON值进行编码,并调用encode()方法以将整个输出返回为字符串:

 <?php

require \' vendor/autoload.php \' ;

$ encoder = new \\ Violet \\ StreamingJsonEncoder \\ BufferJsonEncoder ([ \' array_value \' ]);
echo $ encoder -> encode ();

但是,使用此编码器的最有用方法是将其用作迭代器。当编码器实现Iterator界面时,您可以简单地循环使用foreach循环的生成的JSON:

 <?php

require \' vendor/autoload.php \' ;

$ encoder = new \\ Violet \\ StreamingJsonEncoder \\ BufferJsonEncoder ( range ( 0 , 10 ));

foreach ( $ encoder as $ string ) {
    echo $ string ;
}

还值得注意的是,编码器支持迭代器的值。更重要的是,也将调用任何传递给编码器的封闭,而将返回值则用作值。上一个示例也可以写为:

 <?php

require \' vendor/autoload.php \' ;

$ encoder = new \\ Violet \\ StreamingJsonEncoder \\ BufferJsonEncoder ( function () {
    for ( $ i = 0 ; $ i <= 10 ; $ i ++) {
        yield $ i ;
    }
});

foreach ( $ encoder as $ string ) {
    echo $ string ;
}

附带说明,编码器也将尊重JsonSerializable接口,并将其称为实现接口的对象的jsonSerialize

使用streamjsonencoder

流式编码器与BufferJsonEncoder扩展相同的抽象类时的工作原理非常相似。但是,关键区别在于他们如何处理通过JSON输出。

StreamJsonEncoder接受可召唤作为第二个构造函数参数。每当需要输出JSON时,该可调用都会带有两个参数,即输出的实际字符串和输出的令牌类型(这是JsonToken常数之一)。

如果没有传递可可的信息,则StreamJsonEncoder将简单地使用ECHO语句输出JSON。例如:

 <?php

require \' vendor/autoload.php \' ;

$ encoder = new \\ Violet \\ StreamingJsonEncoder \\ StreamJsonEncoder ([ \' array_value \' ]);
$ encoder -> encode ();

StreamJsonEncoder中的encode()方法返回传递给输出的字节的总数。此编码器使得以流方式写入JSON,使其方便。例如:

 <?php

require \' vendor/autoload.php \' ;

$ fp = fopen ( \' test.json \' , \' wb \' );
$ encoder = new \\ Violet \\ StreamingJsonEncoder \\ StreamJsonEncoder (
    range ( 1 , 100 ),
    function ( $ json ) use ( $ fp ) {
        fwrite ( $ fp , $ json );
    }
);

$ encoder -> encode ();
fclose ( $ fp );

使用jsonstream

流类提供了用于流JSON内容的PSR-7兼容StreamInterface 。它实际上使用BufferJsonEncoder来完成艰苦的工作,并简单地将呼叫以流动方式包装。

JsonStream的构造函数要么接受以编码为JSON的值,要么接受BufferJsonEncoder的实例(允许您设置编码选项)。然后,您可以使用PSR-7接口提供的方法在流上操作。例如:

 <?php

require \' vendor/autoload.php \' ;

$ iterator = function () {
    foreach ( new DirectoryIterator ( __DIR__ ) as $ file ) {
        yield $ file -> getFilename ();
    }
};

$ encoder = ( new \\ Violet \\ StreamingJsonEncoder \\ BufferJsonEncoder ( $ iterator ))
    -> setOptions ( JSON_PRETTY_PRINT );

$ stream = new \\ Violet \\ StreamingJsonEncoder \\ JsonStream ( $ encoder );

while (! $ stream -> eof ()) {
    echo $ stream -> read ( 1024 * 8 );
}

有关PSR-7流的更多信息,请参阅PSR-7文档。

编码器如何解析值

在许多方面, streaming json encoder旨在主要用作json_encode()替换的下降。但是,由于编码器旨在处理大型数据集,因此在处理对象和数组的方式上存在一些显着差异。

首先,要确定如何编码对象,编码器将尝试以以下方式解析对象值:

  • 对于实现JsonSerializable的任何对象,调用了实现的方法jsonSerialize() ,而使用返回值。
  • 将调用任何Closure ,并将使用返回值。但是,没有以这种方式调用其他调用物。

返回的值是循环的,直到无法进一步解决。之后,对数组还是对象是编码为数组还是对象的决定。使用以下逻辑:

  • 以该顺序为0到N-1的任何空数组或数组都编码为JSON数组。所有其他数组均编码为JSON对象。
  • 如果对象实现Traversable实现,并且它要么将Interger 0作为第一个密钥返回,要么根本没有返回值,它将被编码为JSON数组(无论其他键如何)。实现Traversable的所有其他对象均编码为JSON对象。
  • 任何其他对象,无论是空的还是Mey拥有的任何密钥,都被编码为JSON对象。

但是请注意,如果使用JSON编码选项JSON_FORCE_OBJECT ,则所有对象和数组均编码为JSON对象。

请注意,所有对象均通过foreach语句遍历。这意味着使用迭代器返回的值对所有Traversable对象进行编码。对于其他对象,这意味着使用公共属性(根据默认迭代行为)。

所有其他值(即null,布尔值,数字和字符串)的处理方式与json_encode()完全相同(实际上,它用于编码这些值)。

JSON编码选项

BufferJsonEncoderStreamJsonEncoder都有一个方法setOptions()来更改JSON编码选项。接受的选项与json_encode()函数接受的选项相同。编码器仍在内部使用json_encode()方法来编码数组或对象以外的其他值。一些选项也对编码器有其他影响:

  • 使用JSON_FORCE_OBJECT将强制将所有数组和对象编码为JSON对象,类似于json_encode()
  • 使用JSON_PRETTY_PRINT会导致编码器输出空格,以使输出更可读。可以使用方法setIndent()更改所使用的凹痕,该方法可以接受以用作凹痕的字符串参数或用于指示空格数量的整数。
  • 使用JSON_PARTIAL_OUTPUT_ON_ERROR即使编码错误,也会导致编码器继续输出。否则,编码将停止,编码器将抛出一个EncodingException

学分

该图书馆是版权(C)2017-2022 RiikkaKalliomäki。

有关许可证和复制信息,请参见许可证。

下载源码

通过命令行克隆项目:

git clone https://github.com/violet-php/streaming-json-encoder.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 开发教程 streaming json encoder https://www.zuozi.net/31961.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务