Proper way to handle the ampersand character in JSON string send to REST web service

29,251

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?

Share:
29,251
George Taskos
Author by

George Taskos

Updated on August 10, 2020

Comments

  • George Taskos
    George Taskos almost 4 years

    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.

  • George Taskos
    George Taskos over 10 years
    If I replace & with & it fails as well.
  • weiglt
    weiglt over 10 years
    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: stackoverflow.com/questions/11294107/…, encodeURIComponent() seems to work.
  • George Taskos
    George Taskos over 10 years
    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
    George Taskos over 10 years
    This is C#, not Javascript.
  • George Taskos
    George Taskos over 10 years
    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.
  • weiglt
    weiglt over 10 years
    Interesting. Thanks for sharing.
  • George Taskos
    George Taskos over 10 years
    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.
  • Robert Koernke
    Robert Koernke almost 3 years
    It's Uri.EscapeDataString() not Encode...Unless I'm missing something.