Manera correcta de manejar el carácter ampersand en la cadena JSON enviada al servicio web REST


Estoy usando el System.Runtime.Serialization y el DataContractJsonSerialization.

The problem is that in the request I send a value of a property with the & character. Say, AT&T, and I get a response with error: Invalid JSON Data.

I thought that the escaping would be done inside the library but now I see that the serialization is left untouched the ampersand & carácter.

Yes, for a JSON format this is valid. But it will be a problem to my POST request since I need to send this to a server that if contains an ampersand will response with error, hence here I am.

HttpUtility.HtmlEncode está en el System.Web library and so the way to go is using Uri.EscapeUriString. I did this to try, but anyway, and without it all requests are working fine, except an ampersand is in a value.

EDIT: HttpUtility class is ported to the Windows Phone SDK but the prefer way to encode a string should be still Uri.EscapeUriString.

First thought was to get hands dirty and start replacing the special character which would cause a problem in the server, but, I wonder, is there another solution I should do, that it would be efficient and 'proper'?

I should tell that I use

// Convert the string into a byte array.
byte[] postBytes = Encoding.UTF8.GetBytes(data);

To convert the JSON to a byte[] y escribe al Stream. And,

request.ContentType = "application/x-www-form-urlencoded";

A este tenor, WebRequest.ContentType.

So, am I messed up for a reason or something I miss?

Gracias por su atención.

preguntado el 09 de septiembre de 13 a las 23:09

You say that you're sending JSON data, but the content-type says otherwise (application/x-www-form-urlencoded). Can you post more information about how you're sending the data, and how the service is receiving it? -

Even changing it, the server returns 500. -

What do you use on the server? Can you post the server code? -

No i have no access on the server. It's a really strange problem. This should just work. I guess something's wrong with the server, I'll contact the guy handles it. -

Yes, you need to contact the server owner. 500 (Internal Server Error) means something is wrong with the server. -

2 Respuestas

The problem was that I was encoding the whole request string including the key. I had a request data={JSON} and I was formatting it, but the {JSON} part should only be encoded.

string requestData = "data=" + Uri.EncodeDataString(json) // worked perfect!

Stupid hole to step into.

Respondido el 10 de Septiembre de 13 a las 17:09

Interesting. Thanks for sharing. - peso

No problem. It solves my case, you never know who else could miss something similar. Actually it's a combination client-server contract. The server searches if there is a key "data" in the body and if not takes the whole body trying to deserialize it, then in my case it failed due to ampersand character trying to separate as a parameter. - Jorge Taskos

It's Uri.EscapeDataString() not Encode...Unless I'm missing something. - Roberto Koernke

Have you tried replacing the ampersand with & for the POST?

Respondido el 09 de Septiembre de 13 a las 23:09

If I replace & with & it fails as well. - Jorge Taskos

You should never include a regular ampersand in any kind of URL request payload, but always encode it. So i'd say, yeah, you have to get busy there and do some coding. Maybe have a look at:…, encodeURIComponent() seems to work. - peso

I don't mind that, I just wanted to make sure that this is the case. And how would a replace should be done for the other side to get the proper value? I use Uri.EscapeUriString for encoding. - Jorge Taskos

This is C#, not Javascript. - Jorge Taskos

No problem, I think this is a server side issue, it just doesn't work with any encode that I apply to the JSON string. - Jorge Taskos

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.