web-dev-qa-db-fra.com

Newtonsoft.Json SerializeObject sans barres obliques inverses

Compte tenu du code:

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

La sortie est ci-dessous:

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

Lors du débogage d'un document JSON volumineux, il est difficile à lire - utiliser les fonctionnalités intégrées de Newtonsoft.Json (et non des expressions rationnelles ou des hacks qui pourraient casser des choses) est un moyen quelconque de transformer la sortie en chaîne avec la valeur suivante:

{Bar: "something"}
21
g18c

Ce que vous voyez dans le débogueur lorsque vous regardez la valeur json est la valeur de chaîne que vous devez utiliser dans un fichier C # pour obtenir la même valeur.

En effet, vous pourriez remplacer

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

avec 

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

sans changer le comportement du programme.

Ainsi, pour obtenir une valeur différente, vous devez modifier le fonctionnement de JsonConvert , mais JsonConvert est conforme à la norme JSON , oubliez-le!

Si vous ne sérialisez pas réellement ExpandoObject (ni aucune autre classe scellée hors de votre contrôle), vous pouvez utiliser le DebuggerDisplayAttribute sur les types que vous sérialisez en json, pour définir le mode d'affichage de l'objet pendant le débogage (dans votre code, l'instance foo).

Mais une chaîne est une chaîne et VisualStudio a raison: les guillemets doivent être échappés.

6
Giacomo Tesio

Si cela vous arrive en renvoyant la valeur d'une méthode WebApi, essayez de renvoyer l'objet lui-même au lieu de le sérialiser et de renvoyer la chaîne json. WebApi va sérialiser les objets sur json dans la réponse par défaut; si vous retournez une chaîne, il échappera aux guillemets doubles qu'il trouve.

Donc au lieu de:

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

Essayer:

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

Vieille question mais j'ai trouvé ça,

Dans mon cas, je regardais la chaîne JSON dans un débogueur et j'ai constaté que cela ajoutait l'échappement.

Et lorsque j’ai imprimé JSON sur console, c’était sans caractères d’échappement. J'espère que ça aide.

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 je viens d'écrire simplement mis dans un fichier 

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

maintenant, lancez simplement le programme et vous obtiendrez sans slash noir et c'est bon pour les gros programmes où vous devez sauvegarder JSON plusieurs fois

0
Prageeth godage

C'est simplement simple de faire le retour IHttpActionResult et de retourner l'objet 

  public IHttpActionResult Get()
    {

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

        return ok(foo)
    }
0
xlu

Au lieu d'utiliser Newstonsoft.Json, vous devez utiliser la méthode JavaScriptSerializer.Serialize :

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

Cette méthode produit exactement le résultat recherché. Je lis à ce sujet ici .

0
BdN3504