una - serializar y deserializar json c#
¿Forma estandarizada de serializar JSON para consultar la cadena? (4)
¿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
Y en el lado del servidor (Ruby con Sinatra) revisé los parámetros, me da exactamente lo que quieres. :-)
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
usandohttp_build_query
: -columns [0] = name & -columns [1] = column & -where [-or] [customer_id] = 1 & -where [-or] [services] = schedule & -limit = 5 & return = column -
Perl
usandoURI::query_form
: -columns = name & -columns = column & -where = HASH (0x59d6eb8) & - limit = 5 & return = column -
Perl
usandocomplex_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.
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":"[email protected]","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:''[email protected]'',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:''[email protected]'',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 protected]&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 protected]&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 .
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.
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).