11

OK,

I am using the System.Runtime.Serialization and the 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 & 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 the 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[] and write to the Stream. 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.

dbc
  • 104,963
  • 20
  • 228
  • 340
George Taskos
  • 8,324
  • 18
  • 82
  • 147

2 Answers2

11

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.

George Taskos
  • 8,324
  • 18
  • 82
  • 147
  • Interesting. Thanks for sharing. – weiglt Sep 10 '13 at 22:17
  • 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. – George Taskos Sep 13 '13 at 13:23
  • It's Uri.EscapeDataString() not Encode...Unless I'm missing something. – Robert Koernke Jul 06 '21 at 19:22
4

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

weiglt
  • 1,059
  • 8
  • 15
  • If I replace & with & it fails as well. – George Taskos Sep 09 '13 at 22:17
  • 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: http://stackoverflow.com/questions/11294107/how-can-i-send-the-ampersand-character-via-ajax, encodeURIComponent() seems to work. – weiglt Sep 09 '13 at 22:19
  • 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. – George Taskos Sep 09 '13 at 22:21
  • This is C#, not Javascript. – George Taskos Sep 09 '13 at 22:32
  • 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. – George Taskos Sep 09 '13 at 22:53