web-dev-qa-db-ja.com

Jsonを返しますが、これにはバックスラッシュ「\」が含まれていますが、これは望ましくありません

MVC4 web-api、c#を使用して、Jsonを返したいJson.netを使用

問題は、「後方スラッシュ」が付属していることです。

また、このコードをGlobal.asaxに追加しました。

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

これが返すものです。

"{\"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}"

だから私が見たいのは

{"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}

こちらがJsonConvertorです

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

ここで解決策を見つけました

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

ほんの少し前まで、私は同じ問題を抱えていました。 JSON文字列を「二重シリアル化」していたことがわかりました。 jQuery _$.getJson(_ AJAX JsonResultコントローラーアクションの呼び出しを使用します。そして、アクションがC#Generic _List<t>_を構築するため、JSONを返す前にJSON.net/NewtonSoftを使用してC#Generic _List<t>_をJSONオブジェクトに変換する必要があると考えました。

_return Json(fake, JsonRequestBehavior.AllowGet);
_

結局_JsonConvert.SerializeObject(_メソッドを使用する必要はありませんでしたが、明らかにこのreturnはシリアル化を変換してくれます。

それがあなたや他の誰かにも役立つことを願っています。

30
id.ot

ほとんどの場合、スラッシュはVisualStudioデバッガーからコピーしたため、アーティファクトです。デバッガーは、C/C#コードに貼り付けることができる方法ですべての文字列を表示します。送信されたデータには実際にはありません。

ところで:これらのスラッシュはbackwardスラッシュです。スラッシュは次のようになります:/。

10
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"`
10
Maulik

私は同じ問題を抱えています、使用すると応答に\ "が含まれます

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

上記のコードを次のように置き換えた場合、これらのバックスラッシュ\ "は削除されます

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

「完全な」コードスニペットを見るために、これは私が解決策を達成するために使用したものです。

    [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

何時間もこれを理解しようと試みた後、この質問に対する人気のある回答の1つが、私にとって正確であるように見えました。しかし、私が想像した方法ではありません。

私のコードは非常にシンプルでした:

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

「二重シリアル化」の一般的な反応は私には当てはまらないと確信しました。結局、オブジェクトをJSONに明示的に1回だけシリアル化していました。

私はこのスニペットを試しました:

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

私のデータも含まれていないようです!代わりに、これは私が受け取ったものです:

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

うーん...しかし、見よ! Swagger UIでの元の応答をよく見て、それをコピーしてJSON美化機能に貼り付けた後、実際にはどういうわけか「二重シリアル化」していました。 次のコードを使用すると、正しいJSON応答が生成されます

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

そのとおり!シリアル化可能なオブジェクトを直接送信するだけで、JSONにシリアル化する必要はありません!応答がオブジェクトをJSONに自動的にシリアル化するようです。お役に立てれば!

[〜#〜] edit [〜#〜]:データベースからの場合のように、JSON文字列で始める場合、文字列をオブジェクトにデシリアライズしてそのオブジェクトを返すことができます。

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

私は答えの組み合わせが私のために働くことがわかった。上記の誰かが言ったように、私は二重シリアライズをしていました。シリアル化がJsonProperty属性を認識するためには、JsonConvertシリアライザーを使用する必要があります。たとえば、ActualtTargetというプロパティがありますが、Actual-Targetとしてシリアル化する必要があります。 Jsonの結果は、シリアル化するときにJsonPropertyを認識しないため、JsonConvertでシリアル化し、次のような文字列を返しました。

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

私は解決策を見つけ、それが私のために働いた:

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

主に二重シリアル化が原因で発生します。しばらく前にコレクションをJson文字列にシリアル化する必要があった同じ問題があり、さまざまな回避策を試した後でも解決できませんでした。そのため、最後にすべてのシリアル化コードを削除し、コレクションオブジェクトを返すだけで、デフォルトでシリアル化が処理されました。そのため、シリアル化コードを削除して、単純に戻り値の型を返します。同様の問題を抱えている人の助けになることを願っています。

1
Alok Mishra

私の場合、デバッガーでJSON文字列を見ていて、それがエスケープを追加していることがわかりました。また、JSONをコンソールに出力したとき、エスケープ文字はありませんでした。

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

オリジナル: https://stackoverflow.com/a/46836331/4654957

0
Diego Venâncio

ここで私は解決策を見つけました:

                    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

これは、JsonSerializerSettingsおよびContractResolverを使用してオブジェクトをシリアル化する必要がある場合のみです。これにより、循環参照を回避できます。

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

次に、objオブジェクトをコントローラーに送り返し、通常のようにJsonResultを使用します。

0
Chris Auer

解決策を見つけて、私のために働きました(Y)

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

here から取得しました

0
Sam khan