web-dev-qa-db-ja.com

Jsonシリアル化された文字列を返すときにJson.NETがバックスラッシュを追加する

Json.NETを使用してリストをjson文字列にシリアル化しようとしていますが、返された文字列にはバックスラッシュが含まれているため、jsonの解析に失敗しています。

var x = from d in entities.Books.ToList()
        select new
        {
            ID = d.ID,
            BookName = d.BookName
        };
return JsonConvert.SerializeObject(x.ToList());

上記のコードは戻ります

"[{\"ID\":1,\"BookName\":\"MVC Music Store - Tutorial - v3.0\"},{\"ID\":2,\"BookName\":\"Pro.ASP.NET.MVC.3.Framework\"},{\"ID\":3,\"BookName\":\"Application Architecture Guide v2\"},{\"ID\":4,\"BookName\":\"Gang of Four Design Patterns\"},{\"ID\":5,\"BookName\":\"CS4 Pocket Reference\"}]"

これはすべてのJSON解析に失敗します。これらを削除するにはどうすればよいですか。

16
Soham Dasgupta

いいえ、ありません

class Program
{
    class Book
    {
        public int ID;
        public string BookName;
    }

    static void Main()
    {
        var books = new List<Book> { new Book { ID = 1, BookName = "A" }, new Book { ID = 2, BookName = "B" } };

        var x = from d in books
        select new
        {
            ID = d.ID,
            BookName = d.BookName
        };

        string str = JsonConvert.SerializeObject(x.ToList());
        Console.WriteLine(str);
    }
}

2つの問題が考えられます。

A)デバッガからの結果を見ています。これを確認するには、JsonConvertを一時変数に入れ(私が行ったように)、デバッガーで確認します。砂時計の右側の矢印をクリックして、Text Visualizerを選択します。

または

B)呼び出しメソッドがオブジェクトagainをJsonに変換しているため、すべてをエスケープしています。

19
xanatos
string str = "Your string with slashes";

str = JToken.Parse({your string here}).ToString();
3
Damini Suthar

JSONオブジェクトは2回シリアル化されます。

私が解決した:

JSONを返すメソッドレスポンスフォーマットの操作規約を宣言します。文字列ではなくオブジェクトを返すようにメソッドを変更しました。

Jasonのシリアライズは自動的にバックグラウンドで行われます。

2
Hassan Shouman

私は同じ結果を得ていましたが、いくつかのjsonシリアル化のユニットテストを行っているときに、エスケープシェッシュが2倍になりました。私のコードを見て、実際の.netオブジェクトではなく、「予期された」json文字列をシリアル化していることに気付きました。したがって、json文字列をJsonConvert.SerializeObject(expectedJsonString)に渡すと、単にそれを一度エスケープするだけです。これが私がここに来た方法であり、これは私がコーディングの間違いを犯したことに気付いたときに私が書いた答えです...

0
vezenkov