web-dev-qa-db-fra.com

Retourne Json, mais cela inclut les barres obliques inverses "\", que je ne veux pas

J'utilise MVC4 web-api, c # et je veux retourner Json en utilisant Json.net.

le problème est que cela vient avec des "barres obliques inversées".

J'ai également ajouté ce code à Global.asax.

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

voici ce qu'il retourne.

"{\"cid\":1,\"model\":\"WT50JB\",\"detail\":\"sdf??\",\"unit\":2,\"time_in\":\"2012-12-11T19:00:00\",\"time_out\":\"2012-12-12T13:00:06.2774691+07:00\",\"time_used_dd\":0.0,\"time_used_hh\":0.0}"

donc ce que je veux voir c'est

{"cid":1,"model":"WT50JB","detail":"sdf??","unit":2,"time_in":"2012-12-11T19:00:00","time_out":"2012-12-12T13:08:50.5444555+07:00","time_used_dd":0.0,"time_used_hh":0.0}

voici JsonConvertor

string json = JsonConvert.SerializeObject(myObj);
35
riseres

j'ai trouvé la solution ici c'est

return new HttpResponseMessage() 
{
    Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json")
};
19
riseres

J'ai eu le même problème, jusqu'à il y a quelques instants. Il s'avère que je "double sérialiser" la chaîne JSON. J'utilise un appel jQuery $.getJson( AJAX à une action du contrôleur JsonResult. Et parce que l'action génère un List<t> générique C #, j'ai pensé que je devais utiliser JSON.net/NewtonSoft pour convertir le List<t> générique C # en un objet JSON avant de renvoyer le JSON à l'aide des éléments suivants:

return Json(fake, JsonRequestBehavior.AllowGet);

Je n'avais pas besoin d'utiliser la méthode JsonConvert.SerializeObject( après tout, évidemment, cette return convertira la sérialisation pour nous.

J'espère que cela vous aidera ou aidera quelqu'un d'autre.

26
id.ot

Très probablement, les barres obliques sont un artefact car vous les avez copiées à partir du débogueur VisualStudio. Le débogueur affiche toutes les chaînes de manière à ce qu'elles puissent être collées dans le code C/C #. Ils ne sont pas vraiment dans les données transmises.

BTW: Ces barres obliques sont en arrière barres obliques. Une barre oblique ressemblerait à ceci: /.

9
Codo
using Newtonsoft.Json.Linq;
string str = "Your String with Back Slashes";
str = JToken.Parse(str).ToString(); `// Now You will get the Normal String with "NO SLASHES"`
9
Maulik

Pour voir un extrait de code "complet", voici ce que j'ai utilisé pour trouver une solution:

    [AllowAnonymous]
    [HttpGet]
    public HttpResponseMessage GetAllMessages()
    {

        try
        {
            //Load Data Into List
            var mm = new MessageManager();
            List<Message> msgs = mm.GetAllMessages();

            //Convert List Into JSON
            var jsonmsgs = JsonConvert.SerializeObject(msgs);

            //Create a HTTP response - Set to OK
            var res = Request.CreateResponse(HttpStatusCode.OK);

            //Set the content of the response to be JSON Format
            res.Content = new StringContent(jsonmsgs, System.Text.Encoding.UTF8, "application/json");

            //Return the Response
            return res;
        }
        catch (Exception exc)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc);
        }
    }
3
Andrew Birks

Après des heures à essayer de comprendre cela, une réponse populaire à cette question m'a paru parfaitement exacte. Mais pas de la manière que j'ai imaginée.

Mon code était très très simple:

this.Request.CreateResponse(HttpStatusCode.Accepted, new JavaScriptSerializer().Serialize(obj));

J'étais sûr que la réponse populaire de «double sérialisation» ne s'appliquait pas à moi. Après tout, je sérialisais explicitement mon objet sur JSON une seule fois.

J'ai essayé cet extrait:

new StringContent(json, System.Text.Encoding.UTF8, "application/json")

Ce qui ne semblait même pas contenir mes données! Au lieu de cela, voici ce que j'ai reçu:

{
  "Headers": [
    {
      "Key": "Content-Type",
      "Value": [
        "application/json; charset=utf-8"
      ]
    }
  ]
}

Hmmm ... Mais voilà! En regardant de près ma réponse d'origine dans l'interface utilisateur Swagger, puis en la copiant et en la collant dans un embellisseur JSON, j'étais en quelque sorte en train de "sérialiser en double". L'utilisation du code suivant permet d'obtenir la réponse JSON correcte :

 this.Request.CreateResponse(HttpStatusCode.Accepted, obj);

C'est vrai! il suffit d'envoyer l'objet sérialisable directement, pas besoin de sérialiser en JSON! Il semble que la réponse sérialise automatiquement les objets dans JSON. J'espère que cela t'aides!

EDIT: Si vous commencez par une chaîne JSON, comme dans une base de données, vous pouvez désérialiser la chaîne en un objet et renvoyer cet objet - comme suit:

object obj = new JavaScriptSerializer().DeserializeObject(json);
this.Request.CreateResponse(HttpStatusCode.Accepted, obj);
2
Heriberto Lugo

J'ai le même problème, la réponse contient\"quand j'utilise

        JObject res = processRequst(req);
        String szResponse = res.ToString(Formatting.None);
        return Request.CreateResponse<string>(HttpStatusCode.OK, szResponse);

Et ces barres obliques inverses\"sont supprimées si je remplace le code ci-dessus par 

        JObject res = processRequst(req);
        return Request.CreateResponse<JObject>(HttpStatusCode.OK, res);
2
Shiyu

J'ai trouvé qu'une combinaison des réponses fonctionne pour moi. Je faisais une double série comme quelqu'un mentionné ci-dessus. Pour que la sérialisation reconnaisse votre attribut JsonProperty, vous devez utiliser le sérialiseur JsonConvert. Par exemple, j'ai une propriété appelée ActualtTarget mais j'en ai besoin pour être sérialisée en tant que Actual-Target. Le résultat Json ne reconnaîtra pas JsonProperty lors de la sérialisation. J'ai donc sérialisé avec JsonConvert et renvoyé la chaîne comme ci-dessous:

return Content(JsonConvert.SerializeObject(myData));
1
Papa Burgundy

La plupart du temps, cela est dû à une double sérialisation. Il y a quelque temps, j’ai eu le même problème où je devais sérialiser une collection dans une chaîne Json et même après avoir essayé diverses solutions de contournement, j’étais incapable de le résoudre. Ainsi, finalement, tout le code de sérialisation a été supprimé et simplement renvoyé à l'objet de collection. La sérialisation a été prise en charge par défaut. Essayez donc de supprimer le code de sérialisation et de simplement renvoyer le type de retour. J'espère que ça aide quelqu'un avec des problèmes similaires.

1
Alok Mishra

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.

var jsonContent = JsonConvert.SerializeObject(obj); 
Console.WriteLine("HERE NO SLASHES"+ jsonContent); 

original: https://stackoverflow.com/a/46836331/4654957

0
Diego Venâncio

Ici j'ai trouvé la solution:

                    response = response.replace("\"", "\\").replace("\\\\", "\"").replace("\\", "");
                JSONArray PackageData = new JSONArray(response);
                SelectSymbolList.clear();
                for (int i = 0; i < PackageData.length(); i++) {
                    JSONObject jsonData = PackageData.getJSONObject(i);
                    // get your array here
                }
0
Sufiyan Ansari

Cela concerne uniquement les cas où vous devez sérialiser un objet à l'aide de JsonSerializerSettings et ContractResolver. Cela vous permet d'éviter les références circulaires.

var serializerSettings = new JsonSerializerSettings
{
    ContractResolver = .... your contract resolver ....,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc,
    DefaultValueHandling = DefaultValueHandling.Ignore,
};

// convert it to JSON with all the ugly slashes
var json = JsonConvert.SerializeObject(existingContact, serializerSettings);

// now deserialize it into an object
var obj = JsonConvert.DeserializeObject(json);

Envoyez ensuite l'objet obj à votre contrôleur et utilisez JsonResult comme d'habitude.

0
Chris Auer

J'ai trouvé la solution et travaillé pour moi (Y)

var yourString = yourString.Replace("\\","");

Je l'ai eu de ici

0
Sam khan

J'ai trouvé la solution et ça a fonctionné pour moi:

var json = JsonConvert.SerializeObject(sb.ToString(), Formatting.Indented);
response.Content = new StringContent(json, Encoding.UTF8 , "application/json");
0
Jitendra Bansiwal