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

时间:2013-04-08 06:30:00

标签: json serialization query-string http-get

我正在尝试构建一个宁静的API,而我正在努力将JSON数据序列化为HTTP query string

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

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

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

另一种选择是允许用户只传递消息体中的json对象,但我读到我应该避免它(HTTP GET with request body)。

有什么想法吗?

编辑以澄清:

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

  • jQuery使用$.param: - column [] = name& -columns [] = column& -where [-or] [customer_id] = 1& -where [-or] [services] =时间表&安培; -limit = 5&安培;返回=柱
  • PHP使用http_build_query: - column [0] = name& -columns [1] = column& -where [-or] [customer_id] = 1& -where [-or] [服务] =时间表&安培; -limit = 5&安培;返回=柱
  • Perl使用URI::query_form: - column = name& -columns = column& -where = HASH(0x59d6eb8)& -limit = 5& return = column
  • Perl使用complex_to_query: - column:0 = name& -columns:1 = column& -limit = 5& -where.-or.customer_id = 1& -where.-或。服务=时间表&安培;返回=柱

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

4 个答案:

答案 0 :(得分:48)

对您的JSON文本进行URL编码(https://en.wikipedia.org/wiki/Percent-encoding)并将其放入单个查询字符串参数中。例如,如果您想传递{"val": 1}

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

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

答案 1 :(得分:5)

JSON没有单一的标准来查询字符串序列化,所以我制作了一个comparison of some JSON serializers,结果如下:

x

其中最短的是URL Object Notation

答案 2 :(得分:4)

另一个选项可能是node-querystring。它也使用了与你目前列出的方案类似的方案。

npmbower都可以使用,这就是我使用它的原因。

答案 3 :(得分:4)

你怎么试着发送它们如下:

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

我尝试使用REST客户端 enter image description here

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

enter image description here