it-swarm.com.de

Newtonsoft.Json SerializeObject ohne Escape-Backslashes

Gegeben der Code:

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

Die Ausgabe ist unten:

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

Wenn Sie ein großes Json-Dokument debuggen, ist es schwer zu lesen - mithilfe der integrierten Funktionen von Newtonsoft.Json (keine regulären Ausdrücke oder Hacks, die möglicherweise zu Problemen führen könnten) gibt es eine Möglichkeit, die Ausgabe zu einer Zeichenfolge mit dem Wert zu machen:

{Bar: "something"}
21
g18c

Was Sie im Debugger sehen, wenn Sie den Wert json betrachten, ist der Zeichenfolgewert, den Sie in einer C # -Datei verwenden sollten, um denselben Wert zu erhalten.

Sie könnten es tatsächlich ersetzen

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

mit 

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

ohne das Verhalten des Programms zu ändern.

Um einen anderen Wert zu erhalten, sollten Sie ändern, wie JsonConvert funktioniert, aber JsonConvert entspricht dem JSON-Standard . Vergessen Sie es also!

Wenn Sie ExpandoObject (oder auch keine andere versiegelte Klasse außerhalb Ihrer Kontrolle) tatsächlich serialisieren, können Sie mit DebuggerDisplayAttribute für die Typen, die Sie in json serialisieren, festlegen, wie das Objekt angezeigt wird beim Debuggen (in Ihrem Code die foo-Instanz).

Eine Zeichenfolge ist jedoch eine Zeichenfolge, und VisualStudio ist richtig: doppelte Anführungszeichen müssen mit Escapezeichen versehen werden.

6
Giacomo Tesio

Wenn dies der Fall ist, während Sie den Wert aus einer WebApi-Methode zurückgeben, versuchen Sie, das Objekt selbst zurückzugeben, anstatt das Objekt zu serialisieren und den Json-String zurückzugeben. WebApi serialisiert Objekte standardmäßig in der Antwort zu json. Wenn Sie einen String zurückgeben, werden die gefundenen doppelten Anführungszeichen mit Escapezeichen versehen.

Also statt:

public string Get()
{
    ExpandoObject foo = new ExpandoObject();
    foo.Bar = "something";
    string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
    return json;
}

Versuchen:

public ExpandoObject Get()
{
    ExpandoObject foo = new ExpandoObject();
    foo.Bar = "something";
    return foo;
}
6
devRyan

Alte Frage, aber ich habe das gefunden,

In meinem Fall habe ich mir die JSON-Zeichenfolge in einem Debugger angesehen und festgestellt, dass das Escaping hinzugefügt wurde.

Und als ich JSON auf die Konsole gedruckt habe, war das ohne Fluchtzeichen. Ich hoffe es hilft.

1
S52
    [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);

    }
0
SEF

Hey ich schreibe einfach nur in eine Datei 

 using (System.IO.StreamWriter file = 
            new System.IO.StreamWriter(@"jsonGonna.txt", true))
        {
            file.WriteLine(json);
        }

starten Sie einfach das Programm und Sie werden ohne schwarzen Schrägstrich und es ist gut für große Programme, bei denen Sie JSON mehrfach speichern müssen

0
Prageeth godage

Es ist einfach die Rückgabe IHttpActionResult und das Objekt zurückzugeben 

  public IHttpActionResult Get()
    {

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

        return ok(foo)
    }
0
xlu

Anstelle von Newstonsoft.Json sollten Sie die JavaScriptSerializer.Serialize-Methode verwenden:

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

Diese Methode erzeugt genau die Ausgabe, nach der Sie suchen. Ich habe darüber hier gelesen.

0
BdN3504