PHP中处理JSON数组和对象

客户端有一些混淆的资源是围绕着JSON的数组和对象,以及如何在PHP中指定它们。特别是,问题是由空对象和空数组导致的。这篇文章回告诉你一些在Elasticsearch JSON API中的常用模式,以及如何转换成为PHP表示形式。

空对象

Elasticsearch API 在很多地方使用空的JSON对象,这可能在PHP中会导致一些问题。与其他语言不同,PHP并没有为空对象提供一个“短”的标示,所以许多开发人员都不知道如何制定一个空对象。

考虑向查询中添加高亮显示:

  1. {
  2. "query" : {
  3. "match" : {
  4. "content" : "quick brown fox"
  5. }
  6. },
  7. "highlight" : {
  8. "fields" : {
  9. "content" : {}//这个空对象就是导致问题的地方
  10. }
  11. }
  12. }

问题是PHP会自动转换"content" : {} 成 "content" : [],这对于Elasticsearch DSL来说已不再有效。我们需要告诉PHP空对象是显试的对象,不是一个数组。如果要在PHP中定义一个查询,你需要这样做:

  1. $params['body'] = array(
  2. 'query' => array(
  3. 'match' => array(
  4. 'content' => 'quick brown fox'
  5. )
  6. ),
  7. 'highlight' => array(
  8. 'fields' => array(
  9. 'content' => (object) array()//我们投掷一个空的数组到一个对象上来表示一个空的对象,JSON现在能够编码正确
  10. )
  11. )
  12. );
  13. $results = $client->search($params);

通过使用一个空数组转换为对象,我们可以强制 json_encode 解析器正确输出一个空的对象,而不是一个空数组。可悲的是,这个冗长的解决方案是PHP中唯一能够实现目标的。因为PHP并没有为空对象提供一个“短”的标示。

数组对象

Elasticsearch DSL中另外一个通用模式是数组对象,例如,考虑在查询中添加一个排序:

  1. {
  2. "query" : {
  3. "match" : { "content" : "quick brown fox" }
  4. },
  5. "sort" : [ //"sort"包含一个JSON数组对象
  6. {"time" : {"order" : "desc"}},
  7. {"popularity" : {"order" : "desc"}}
  8. ]
  9. }

这种安排是非常常见的,但是在PHP中可能会非常棘手,以为她需要一个嵌套的数组,PHP冗长的难解的方案还在继续,为了构造一个数组对象,你确实需要一个数组的数组:

  1. $params['body'] = array(
  2. 'query' => array(
  3. 'match' => array(
  4. 'content' => 'quick brown fox'
  5. )
  6. ),
  7. 'sort' => array( //这个数组编码成"sort": []
  8. array('time' => array('order' => 'desc')), //这个数组编码成{"time": {"order": "desc"}}
  9. array('popularity' => array('order' => 'desc')) //这个数组编码成{"popularity": {"order": "desc"}}
  10. )
  11. );
  12. $results = $client->search($params);

如果你使用的是PHP5.4+的版本,我强烈鼓励你使用短数组语法,它使得这些嵌套的数组读起来更简单:

  1. $params['body'] = [
  2. 'query' => [
  3. 'match' => [
  4. 'content' => 'quick brown fox'
  5. ]
  6. ],
  7. 'sort' => [
  8. ['time' => ['order' => 'desc']],
  9. ['popularity' => ['order' => 'desc']]
  10. ]
  11. ];
  12. $results = $client->search($params);

空数组对象

偶尔地,你会遇到需要前面两种模式,积分查询函数是一个好例子,有时需要一个数组对象,这些对象可能是空的JSON对象。

下面给出这个查询:

  1. {
  2. "query":{
  3. "function_score":{
  4. "functions":[
  5. {
  6. "random_score":{}
  7. }
  8. ],
  9. "boost_mode":"replace"
  10. }
  11. }
  12. }

我们可以使用下面的PHP代码生成:

    1. $params['body'] = array(
    2. 'query' => array(
    3. 'function_score' => array(
    4. 'functions' => array( //  这个编码成:"functions": []
    5. array( // 这个编码成一个对象在数组里:{"random_score": {}}
    6. 'random_score' => (object) array() // 这个编码成一个空的JSON对象: "random_score": {}
    7. )
    8. )
    9. )
    10. )
    11. );
    12. $results = $client->search($params);

Elasticsearch-PHP 处理JSON数组和对象的更多相关文章

  1. 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式

    表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...

  2. PHP中json数组与对象的问题

    在PHP后端,对于数组和对象的区分不是很大,主要用到的数组居多,而PHP提供接口时响应的一般是json数据(为什么使用json呢,总体来说就是体积小速度快).但是前端对数组对象很'敏感',所以对PHP ...

  3. PHP JSON数组与对象的理解

    在PHP后端和客户端数据交互的过程中,JSON数据中有时格式不定,一会儿是数组,一会儿是对象,弄得客户端开发人员要崩溃的感觉. 因此,前后端相关人员先对PHP的json_encode函数原理有必要的了 ...

  4. (实用篇)PHP JSON数组与对象的理解

    在PHP后端和客户端数据交互的过程中,JSON数据中有时格式不定,一会儿是数组,一会儿是对象,弄得客户端开发人员要崩溃的感觉. 因此,前后端相关人员先对PHP的json_encode函数原理有必要的了 ...

  5. (精华)将json数组和对象转换成List和Map(小龙哥和牛徳鹤的对话)

    将java标准的数据结构ArrayList和HashMap转换成json对象和数组很简单 只需要JSONArray.fromObject(obj);或者JSONObject.fromObject(ob ...

  6. json 数组 对象 xml 之间转换(待补充)

    json 数组  xml 对象   之间转换(待补充) 1 把对象的类型或者数组转换成字符串类型(或者更确切的说是json类型的). 此处参考链接http://www.jb51.net/article ...

  7. C#解析JSON数组

    方式一 第一步:使用前,需下载:Newtonsoft.Json.dll 没有的,请到我百度云盘下载 链接:https://pan.baidu.com/s/1JBkee4qhtW7XOyYFiGOL2Q ...

  8. ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

    这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  9. JSon_零基础_002_将List类型数组转换为JSon格式的对象字符串,返回给界面

    将List类型数组转换为JSon格式的对象字符串,返回给界面 所需要导入的包: 编写bean: package com.west.webcourse.po; /** * 第01步:编写bean类, * ...

随机推荐

  1. Roslyn 语法树中的各种语法节点及每个节点的含义

    使用 Roslyn 进行源码分析时,我们会对很多不同种类的语法节点进行分析.如果能够一次性了解到各种不同种类的语法节点,并明白其含义和结构,那么在源码分析的过程中将会更加得心应手. 本文将介绍 Ros ...

  2. WPF 绘制对齐像素的清晰显示的线条

    此前有小伙伴询问我为何他 1 像素的线条显示发虚,然后我告诉他是“像素对齐”的问题,然而他设置了各种对齐像素的属性依旧没有作用.于是我对此进行了一系列试验,对 WPF 像素对齐的各种方法进行了一次总结 ...

  3. vmware linux nat模式设置静态ip

    网上资料很多,但是都不怎么实用,这里给大家总结一下.nat模式上网.因为nat本身就能上网为什么还要设置ip.这有点自找麻烦.但是在集群这是必须的.要么你搭建伪分布,要么至少具有三台物理机器.为了节省 ...

  4. json常用方法和本地存储方法

    1.JSON.parse()[把json字符串解析成json对象] 2.JSON.stringify()[把json对象中解析成json字符串] <script> let obj = '{ ...

  5. BZOJ4547 Hdu5171 小奇的集合

    题意 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个值为非负数) 对于100%的数据,有 n<=10^5,k& ...

  6. Apache Accumulo

    Apache Accumulo 是一个可靠的.可伸缩的.高性能的排序分布式的 Key-Value 存储解决方案, 基于单元访问控制以及可定制的服务器端处理.Accumulo使用 Google BigT ...

  7. Beyond Compare3 注册密钥和添加到右键菜单

    本人使用的是 Beyond Compare 3 ,版本 3.3.8(build 16340),密钥应收Beyond Compare 3都能够使用. 如想查看密钥,请参考本文末尾的隐藏内容 Beyond ...

  8. JavaFX 之窗口跳转(一)

    一.前言 笔者此处不讲JavaFX的基础API,只针对笔者工作时遇到的问题进行记录与总结. 零基础的网友可以访问 http://www.javafxchina.net/blog/docs/tutori ...

  9. 对SQLite数据库操作 操作db文件

    sqlite数据库就是一个DB文件.  程序每操作一次数据库都要读一次 .DB  文件 .  这个文件就是这个SQLite数据库. 如果需要依赖包的可以联系我 工具类: package com.hot ...

  10. 深入理解jQuery框架-框架结构

    这是本人结合资料视频总结出来的jQuery大体框架结构,如果大家都熟悉了之后,相信你们也会写出看似高档的js框架: jquery框架的总体结构 (function(w, undefined){ //定 ...