Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams
dynamic foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);

The output is below:

"{\"Bar\":\"something\"}"

When debugging a large json document it is hard to read - using the built in features of Newtonsoft.Json (not regex or hacks that could break things) is there any way to make the output a string with the valie:

{Bar: "something"}
                How are you viewing the output? It's being rendered as a string literal which doesn't fit with JSON.NET and SerializeObject alone unless it's being serialized a 2nd time. If you're viewing the value within VS (via Locals, Watch, etc.), then it's rendering the value as code, but should have an option to view as text instead.
– Jonathan Lonowski
                Dec 1, 2013 at 14:48
                Yes that's from the debugger viewing a string variable in vs2012. I did look at the viewer options they are string, xml and i think html
– morleyc
                Dec 1, 2013 at 18:10

If this happens to you while returning the value from a WebApi method, try returning the object itself, instead of serializing the object and returning the json string. WebApi will serialize objects to json in the response by default; if you return a string, it will escape any double quotes it finds.

So instead of:

public string Get()
    ExpandoObject foo = new ExpandoObject();
    foo.Bar = "something";
    string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
    return json;
public ExpandoObject Get()
    ExpandoObject foo = new ExpandoObject();
    foo.Bar = "something";
    return foo;
                What should I do if I want to write unit tests that check what the serialized output looks like?
– christiaantober
                Dec 21, 2019 at 20:39

Try the JToken.Parse method. I've found that even though when I view JSON objects in the debugger and they are correct, when I go to manipulate them they end up being converted to literals (i.e. backslashes are added). The JToken.Parse method seems to avoid this.

var token = JToken.Parse(text);

So in the case of the original question it would be something like:

dynamic foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
var token = JToken.Parse(json);
//Do stuff with token -- not json string

In my case specifically the issue was that using JObject.Add(json) would not recognize that my string was json and just insert the entire string as a single property. Once converted into a Jtoken however the JSON was interpreted correctly.

What you see in debugger when looking at the json value is the string value that you should use in a C# file to obtain the same value.

Indeed you could replace

dynamic foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
string json = "{\"Bar\":\"something\"}";

without changing the program's behaviour.

Thus, to obtain a different value, you should change how JsonConvert works, but JsonConvert conforms to the JSON standard, thus forget it!

If you are not actually serializing ExpandoObject (nor any other sealed class out of your control), you can use the DebuggerDisplayAttribute on the types that you are serializing in json, to define how the object will be shown during debug (in your code, the foo instance).

But a string is a string and VisualStudio is right: double-quotes must be escaped.

this happens when you SerializeObject an object from a web service. What you see in web browser output is that escaped string, which makes the output useless, unless you want to deal with that snafu on client side. No thank you, I'd much rather prefer to get proper json sent to my clients from my web service. In other words, my web service should return the string that I gave it, as I gave it. – Tuncay Göncüoğlu Jun 29, 2016 at 8:58 @TuncayGöncüoğlu it sounds like you are returning a string object, which is getting serialized again into a JSON string. Post your issue as a question and we can help you solve it. – Cory Nelson Jul 14, 2016 at 0:08

Old question but I found this,

In my case, I was looking at the JSON string in a debugger and I found that was adding the escaping.

And when I printed JSON to console, it was without escape characters. Hope it helps.

Instead of using Newstonsoft.Json you should employ the JavaScriptSerializer.Serialize Method:

dynamic foo = new ExpandoObject();
foo.Bar = "something";
var js = new JavaScriptSerializer( );
string json = js.Serialize(foo);

This method produces exactly the output you are looking for. I read about it here.

Its Just simple make the return IHttpActionResult and return the object

  public IHttpActionResult Get()
        ExpandoObject foo = new ExpandoObject();
        foo = //query result
        return ok(foo)

Actually it has nothing to do with serializer. It's just because c# don't have single and double quotes concept like Javascipt does. So it can't show string with double quotes without escaping them. But if you want to put string into html/ cshtml without any escapes you just need to tell compliler that like so:

window.MYVAR = JSON.parse('@Html.Raw(ViewBag.MyStringFromCSharp)');

In case you're getting your data from a controller view method in such a format and finding it difficult to work with in JavaScript. Below is an easy work around:

const CleanUpDifficultJSonData = difficultJSonData => {
  const dummyElement = document.createElement('div');
  dummyElement.innerHtml = difficultJSonData;
  const cleanJSonData = JSON.parse(dummyElement.innerHtml);
  return cleanJSonData;
const difficultJSonData = "{\"Bar\":\"something\"}";
console.log('cleanJSonData: ', 
CleanUpDifficultJSonData(difficultJSonData));      
object result = ""; var db = new dbEntities(); var EO = new System.Dynamic.ExpandoObject() as IDictionary<string, Object>; //needed to return proper JSON without escape slashes IEnumerable<usp_GetComplaint_Result> aRow = db.usp_GetComplaint(id); string DBL_QUOTE = new string(new char[] { '"' }); result = "{"; foreach (usp_GetComplaint_Result oneRow in aRow) System.Reflection.PropertyInfo[] properties = typeof(usp_GetComplaint_Result).GetProperties(); foreach(System.Reflection.PropertyInfo property in properties) var vValue = property.GetValue(oneRow) == null ? "null" : property.GetValue(oneRow); EO.Add(property.Name,vValue); break; catch (Exception ex) result = ex.Message; EO.Add("Error", result); finally db.Dispose(); return Ok(EO);

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.