Newtonsoft.Json SerializeObject没有转义反斜杠

时间:2013-12-01 14:07:08

标签: c# json json.net

鉴于代码:

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

输出如下:

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

调试大型json文档时很难阅读 - 使用Newtonsoft.Json的内置功能(不是正则表达式或可能破坏事物的黑客攻击)有没有办法使输出成为一个带有valie的字符串:

{Bar: "something"}

8 个答案:

答案 0 :(得分:8)

如果在从WebApi方法返回值时发生这种情况,请尝试返回对象本身,而不是序列化对象并返回json字符串。默认情况下,WebApi会将对象序列化为响应中的json;如果你返回一个字符串,它将转义它找到的任何双引号。

所以而不是:

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;
}

答案 1 :(得分:6)

在查看json值时,您在调试器中看到的是您应该在C#文件中使用的字符串值,以获取相同的值。

确实可以替换

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

string json = "{\"Bar\":\"something\"}";

不改变程序的行为。

因此,要获得不同的值,您应该更改JsonConvert的工作方式,但JsonConvert符合JSON standard,因此忘记了它!

如果您实际上没有序列化ExpandoObject(也没有任何其他密封类超出您的控制范围),您可以在json中序列化的类型上使用DebuggerDisplayAttribute来定义对象的方式将在调试期间显示(在您的代码中,foo实例)。

但字符串是一个字符串,VisualStudio是正确的:必须转义双引号。

答案 2 :(得分:4)

试试 JToken.Parse 方法。我发现即使我在调试器中查看 JSON 对象并且它们是正确的,当我去操作它们时,它们最终会被转换为文字(即添加了反斜杠)。 JToken.Parse 方法似乎避免了这种情况。

var token = JToken.Parse(text);

所以在原始问题的情况下,它会是这样的:

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

就我而言,问题是使用 JObject.Add(json) 无法识别我的字符串是 json,而只是将整个字符串作为单个属性插入。一旦转换为 Jtoken,JSON 就会被正确解释。

答案 3 :(得分:2)

老问题,但我发现了这个,

在我的情况下,我在调试器中查看JSON字符串,我发现正在添加转义。

当我将JSON打印到控制台时,它没有转义字符。希望它有所帮助。

答案 4 :(得分:1)

很简单,只需返回IHttpActionResult并返回对象

  public IHttpActionResult Get()
    {

        ExpandoObject foo = new ExpandoObject();
        foo = //query result

        return ok(foo)
    }

答案 5 :(得分:0)

您应该使用JavaScriptSerializer.Serialize Method

,而不是使用Newstonsoft.Json
dynamic foo = new ExpandoObject();
foo.Bar = "something";
var js = new JavaScriptSerializer( );
string json = js.Serialize(foo);

此方法可准确生成您要查找的输出。我读到了它here

答案 6 :(得分:0)

嘿我只是简单地写出文件

iccTransmitApduBasicChannel()

现在只需运行该程序就可以获得没有黑色斜杠的功能,这对于需要多次保存JSON的大型程序非常有用

答案 7 :(得分:0)

    [HttpGet]
    public object Get(int id)
    {

        object result = "";
        var db = new dbEntities();
        var EO = new System.Dynamic.ExpandoObject() as IDictionary<string, Object>; //needed to return proper JSON without escape slashes
        try
        {

            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);

    }