Proper way to handle the ampersand character in JSON string send to REST web service
Solution 1
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.
Solution 2
Have you tried replacing the ampersand with &
for the POST?
George Taskos
Updated on August 10, 2020Comments
-
George Taskos almost 4 years
OK,
I am using the
System.Runtime.Serialization
and theDataContractJsonSerialization
.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
&
character.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
is in theSystem.Web
library and so the way to go is usingUri.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 stillUri.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[]
and write to theStream
. And,request.ContentType = "application/x-www-form-urlencoded";
As the
WebRequest.ContentType
.So, am I messed up for a reason or something I miss?
Thank you.
-
George Taskos over 10 yearsIf I replace & with & it fails as well.
-
weiglt over 10 yearsYou 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: stackoverflow.com/questions/11294107/…, encodeURIComponent() seems to work.
-
George Taskos over 10 yearsI 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.
-
George Taskos over 10 yearsThis is C#, not Javascript.
-
George Taskos over 10 yearsNo problem, I think this is a server side issue, it just doesn't work with any encode that I apply to the JSON string.
-
weiglt over 10 yearsInteresting. Thanks for sharing.
-
George Taskos over 10 yearsNo 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.
-
Robert Koernke almost 3 yearsIt's Uri.EscapeDataString() not Encode...Unless I'm missing something.