¿Forma estandarizada de serializar JSON para consultar la cadena?

Estoy tratando de construir una API relajante y estoy luchando sobre cómo serializar datos JSON en una HTTP query string .

Hay una serie de argumentos obligatorios y opcionales que deben pasarse en la solicitud, por ejemplo (representados como un objeto JSON a continuación):

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

Necesito admitir un número variado de clientes diferentes, así que estoy buscando una forma estandarizada para convertir este objeto json en una cadena de consulta. ¿Hay uno y cómo se ve?

Otra alternativa es permitir que los usuarios simplemente pasen el objeto json en el cuerpo del mensaje, pero leo que debo evitarlo ( HTTP GET con el cuerpo de la solicitud ).

¿Alguna idea?

Editar para aclarar:

Enumerar cómo algunos idiomas diferentes codifican el objeto json dado arriba:

  • jQuery usando $.param : -columns [] = name & -columns [] = column & -where [-or] [customer_id] = 1 & -where [-or] [services] = schedule & -limit = 5 & return = column
  • PHP usando http_build_query : -columns [0] = name & -columns [1] = column & -where [-or] [customer_id] = 1 & -where [-or] [services] = schedule & -limit = 5 & return = column
  • Perl usando URI::query_form : -columns = name & -columns = column & -where = HASH (0x59d6eb8) & – limit = 5 & return = column
  • Perl usando complex_to_query : -columns: 0 = name & -columns: 1 = column & -limit = 5 & -where.-or.customer_id = 1 & -where.-or.services = schedule & return = column

jQuery y PHP es muy similar. Perl usando complex_to_query también es bastante similar a ellos. Pero ninguno se ve exactamente igual.

URL-encode ( https://en.wikipedia.org/wiki/Percent-encoding ) su texto JSON y colóquelo en un único parámetro de cadena de consulta. por ejemplo, si quiere pasar {"val": 1} :

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

Tenga en cuenta que si su JSON es demasiado largo, se encontrará con un problema de limitación de longitud de URL. En ese caso usaría POST con un cuerpo (sí, lo sé, enviar un POST cuando quiera buscar algo no es “puro” y no encaja bien en el paradigma REST, pero tampoco es su consulta específica basada en JSON de dominio idioma).

Otra opción podría ser node-querystring . También utiliza un esquema similar a los que ha enumerado hasta ahora.

Está disponible tanto en npm como en npm , por lo que lo he estado usando.

¿Qué tal si prueba esto enviándolos de la siguiente manera?

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

Lo intenté con un cliente REST enter image description here

Y en el lado del servidor (Ruby con Sinatra) revisé los parámetros, me da exactamente lo que quieres. 🙂

enter image description here

No existe un estándar único para que JSON consulte la serialización de cadenas, así que hice una comparación de algunos serializadores JSON y los resultados son los siguientes:

 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 

El más corto entre ellos es la Notación de Objeto URL .