将JSON序列化为查询字符串的标准化方法?

And*_*eas 50 serialization json http-get query-string

我正在努力建立一个宁静的API,我正在努力如何将JSON数据序列化为HTTP query string.

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

{
   "-columns" : [
      "name",
      "column"
   ],
   "-where" : {
      "-or" : {
         "customer_id" : 1,
         "services" : "schedule"
      }
   },
   "-limit" : 5,
   "return" : "table"
}
Run Code Online (Sandbox Code Playgroud)

我需要支持不同数量的不同客户端,所以我正在寻找一种标准化的方法将这个json对象转换为查询字符串.有一个,它看起来怎么样?

另一种方法是允许用户只是传递消息体中的json对象,但我读到我应该避免它(带请求体的HTTP GET).

有什么想法吗?

编辑以澄清:

列出一些不同的语言如何编码上面给定的json对象:

  • jQueryusing $.param:-columns [] = name&-columns [] = column&-where [-or] [customer_id] = 1&-where [-or] [services] = schedule&-limit = 5&return = column
  • PHPusing http_build_query:-columns [0] = name&-columns [1] = column&-where [-or] [customer_id] = 1&-where [-or] [services] = schedule&-limit = 5&return = column
  • Perl使用URI::query_form:-columns = name&-columns = column&-where = HASH(0x59d6eb8)& - limit = 5&return = column
  • Perlusing complex_to_query:-columns:0 = name&-columns:1 = column&-limit = 5&-where.-or.customer_id = 1&-where.-or.services = schedule&return = column

jQuery和PHP非常相似.使用complex_to_query的Perl也非常类似于它们.但没有一个看起来完全一样.

ako*_*nsu 49

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

mysite.com/path?json=%7B%22val%22%3A%201%7D
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的JSON太长,那么您将遇到URL长度限制问题.在这种情况下,我会使用POST一个正文(是的,我知道,POST当你想要获取某些东西时发送一个不是"纯粹的"并且不适合REST范例,但你的域特定的基于JSON的查询语言也不适合) .

  • 是的,这可能是实现这一目标的一种方法。我怀疑我会遇到 URL 长度限制问题。我想知道什么是最好的:1)传递单个 json 参数2)使用POST(尽管我们正在获取)或3)使用带有消息正文的GET。也许同时支持 1) 和 3) ? (2认同)

niu*_*ech 7

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
Run Code Online (Sandbox Code Playgroud)

其中最短的是URL Object Notation


Sag*_*ani 6

您尝试按如下方式发送它们怎么样:

http://example.com/api/wtf?
[-columns][]=name&
[-columns][]=column&
[-where][-or][customer_id]=1&
[-where][-or][services]=schedule&
[-limit]=5&
[return]=table&
Run Code Online (Sandbox Code Playgroud)

我尝试使用 REST 客户端 在此输入图像描述

在服务器端(Ruby 和 Sinatra)我检查了参数,它给了我你想要的东西。:-)

在此输入图像描述


wpr*_*prl 5

另一种选择可能是node-querystring。它还使用与您迄今为止列出的方案类似的方案。

它在npm和中都可用bower,这就是我一直在使用它的原因。