标准化的方式进行序列化JSON查询字符串?(Standardized way to serializ

2019-08-20 05:52发布

我试图建立一个RESTful API和我挣扎于如何序列化JSON数据到一个HTTP query string

有许多的需要在该请求,例如(表示为下面JSON对象)传递必需和可选参数:

{
   "-columns" : [
      "name",
      "column"
   ],
   "-where" : {
      "-or" : {
         "customer_id" : 1,
         "services" : "schedule"
      }
   },
   "-limit" : 5,
   "return" : "table"
}

我需要支持各种数量的不同客户,所以我正在寻找一种标准化的方式来此JSON对象转换为查询字符串。 是否有一个,和它是如何看?

另一种方法是让用户只沿着在消息体中的JSON对象传递,但我读我应该避免它( HTTP GET请求与身体 )。

有什么想法吗?

编辑澄清:

清单怎么有些不同的语言编码给出JSON对象上:

  • jQuery使用$.param :-columns [] =名&-columns [] =&柱-where [-OR] [CUSTOMER_ID] = 1&-where [-OR] [服务] =时间表&-limit = 5&回报=柱
  • PHP使用http_build_query :-columns [0] =&名称-columns [1] =&柱-where [-OR] [CUSTOMER_ID] = 1&-where [-OR] [服务] =时间表&-limit = 5&回报=柱
  • Perl使用URI::query_form :-columns =名&-columns =柱&-where = HASH(0x59d6eb8) -极限= 5&回报=柱
  • Perl使用complex_to_query :-columns:0 =&名称-columns:1 =&柱-limit = 5&-where.-or.customer_id = 1&-where.-or.services =时间表&回报=柱

jQuery和PHP是非常相似的。 Perl的使用complex_to_query也相当类似他们。 但没有长得一模一样。

Answer 1:

URL编码( https://en.wikipedia.org/wiki/Percent-encoding )您的JSON文本,并把它变成一个单一的查询字符串参数。 例如,如果你想通过{"val": 1}

mysite.com/path?json=%7B%22val%22%3A%201%7D

请注意,如果你的JSON变得很长,那么你会碰到一个URL长度的限制问题。 在这种情况下,我会使用POST与主体(是的,我知道,发送POST当你想获取的东西是不是“纯粹”的,不合身进入休息模式,但也不是你的特定领域基于JSON的查询语言)。



Answer 2:

另一种选择可能是节点的查询字符串 。 它也使用了类似的计划,你上市至今的人。

这两种可用的npmbower ,这就是为什么我一直在用它。



Answer 3:

没有单一的标准JSON来查询字符串序列化,所以我做了一些JSON序列化的比较 ,结果如下:

JSON:    {"_id":"5973782bdb9a930533b05cb2","isActive":true,"balance":"$1,446.35","age":32,"name":"Logan Keller","email":"logankeller@artiq.com","phone":"+1 (952) 533-2258","friends":[{"id":0,"name":"Colon Salazar"},{"id":1,"name":"French Mcneil"},{"id":2,"name":"Carol Martin"}],"favoriteFruit":"banana"}
Rison:   (_id:'5973782bdb9a930533b05cb2',age:32,balance:'$1,446.35',email:'logankeller@artiq.com',favoriteFruit:banana,friends:!((id:0,name:'Colon Salazar'),(id:1,name:'French Mcneil'),(id:2,name:'Carol Martin')),isActive:!t,name:'Logan Keller',phone:'+1 (952) 533-2258')
O-Rison: _id:'5973782bdb9a930533b05cb2',age:32,balance:'$1,446.35',email:'logankeller@artiq.com',favoriteFruit:banana,friends:!((id:0,name:'Colon Salazar'),(id:1,name:'French Mcneil'),(id:2,name:'Carol Martin')),isActive:!t,name:'Logan Keller',phone:'+1 (952) 533-2258'
JSURL:   ~(_id~'5973782bdb9a930533b05cb2~isActive~true~balance~'!1*2c446.35~age~32~name~'Logan*20Keller~email~'logankeller*40artiq.com~phone~'*2b1*20*28952*29*20533-2258~friends~(~(id~0~name~'Colon*20Salazar)~(id~1~name~'French*20Mcneil)~(id~2~name~'Carol*20Martin))~favoriteFruit~'banana)
QS:      _id=5973782bdb9a930533b05cb2&isActive=true&balance=$1,446.35&age=32&name=Logan Keller&email=logankeller@artiq.com&phone=+1 (952) 533-2258&friends[0][id]=0&friends[0][name]=Colon Salazar&friends[1][id]=1&friends[1][name]=French Mcneil&friends[2][id]=2&friends[2][name]=Carol Martin&favoriteFruit=banana
URLON:   $_id=5973782bdb9a930533b05cb2&isActive:true&balance=$1,446.35&age:32&name=Logan%20Keller&email=logankeller@artiq.com&phone=+1%20(952)%20533-2258&friends@$id:0&name=Colon%20Salazar;&$id:1&name=French%20Mcneil;&$id:2&name=Carol%20Martin;;&favoriteFruit=banana
QS-JSON: isActive=true&balance=%241%2C446.35&age=32&name=Logan+Keller&email=logankeller%40artiq.com&phone=%2B1+(952)+533-2258&friends(0).id=0&friends(0).name=Colon+Salazar&friends(1).id=1&friends(1).name=French+Mcneil&friends(2).id=2&friends(2).name=Carol+Martin&favoriteFruit=banana

其中最短的是URL对象符号 。



Answer 4:

怎么样,你试试这个送他们如下:

http://example.com/api/wtf?
[-columns][]=name&
[-columns][]=column&
[-where][-or][customer_id]=1&
[-where][-or][services]=schedule&
[-limit]=5&
[return]=table&

我试着用REST客户端

而在服务器端(红宝石西纳特拉)我查了一下参数,可以它给了我正是你想要的。 :-)



文章来源: Standardized way to serialize JSON to query string?