2016-12-06 35 views
0

この問題について多数の質問を読んでいますが、私の特定の問題を解決できないようです。JsonConvert.SerializeObjectバックスラッシュをエスケープする

Webサービス関数からjson文字列を返しています。

Iは、これらのオブジェクトを持っている:

public class WebServiceInitResult 
{ 
    public List<Activity> Activities { get; set; } 
    //rest of properties left out... 
} 

public class Activity 
{ 
    public string IconCode { get; set; } 
    //rest of properties left out... 
} 

IconCodeはfontawesome文字、これらのいずれかの文字コードである:

\uf0b1 
\uf274 
\uf185 
\uf0fa 
\uf0f4 
\uf015 

それらは、上に示したとおりにデータベースに格納されています。

私は以下のようにhttpReponse.Contentを設定すると、バックスラッシュがエスケープされています

httpResponseMessage.Content = new StringContent(JsonConvert.SerializeObject(webServiceInitResult), Encoding.UTF8, "application/json"); 

郵便配達で受信したJSONレスポンスは、次のとおりです。

"activities": [ 
{ 
    "ActivityCode": 2, 
    "DisplayValue": "Shopping", 
    "BackgroundColour": "E74C3C", 
    "IconCode": "\\uf0b1", 
    "ApplicationId": 2, 
    "Application": null, 
    "Id": 1, 
    "Active": true, 
    "DateCreated": "2016-11-25T10:15:40" 
}, 
//rest of activities 
] 

あなたが見ることができるように、IconCodeバックスラッシュはエスケープされています。他の質問を読むことから、私がシリアル化するとき、または応答が送られたときにJson.NETによってこれが起こっているかどうか確信することができません。

代わりにObjectContentを使用して解決しようとしましたが、私はJson.NETを避けることができましたが、同じ結果を返しました!

httpResponseMessage.Content = new ObjectContent(typeof(TravelTrackerWebServiceInitResult), webServiceInitResult, new JsonMediaTypeFormatter() , "application/json"); 

今、私は立ち往生しています!

これを行うより良い方法は、私が必要とするものを正確に返しますか?文字は、適切なアイコンを表示するためにアプリケーションによって使用されます。

追加情報: 私はもともと、これらの値はハードコードしていたし、すべてが正常に動作するように見えた:

webServiceInitResult.activities_TT = new List<Activity_TT>() 
{ 
new Activity() { ActivityCode = 2, BackgroundColour = "E74C3C", DisplayValue="Shopping", IconCode="\uf0b1" }, 
new Activity() { ActivityCode = 3, BackgroundColour = "BF7AC5", DisplayValue="Running", IconCode="\uf274" }, 
new Activity() { ActivityCode = 4, BackgroundColour = "AF7AC5", DisplayValue="Walking", IconCode="\uf185" }, 
new Activity() { ActivityCode = 5, BackgroundColour = "3498DB", DisplayValue="Jogging", IconCode="\uf0fa" }, 
new Activity() { ActivityCode = 6, BackgroundColour = "2ECC71", DisplayValue="Resting", IconCode="\uf0f4" }, 
new Activity() { ActivityCode = 7, BackgroundColour = "F39C12", DisplayValue="Skipping", IconCode="\uf015" } 
}; 

感謝。

+1

* "IconCodeは、フォントワーム文字の文字コードです。これらは、次のいずれかです:' \ uf0b1' \ uf274'' \ uf185'' \ uf0fa'' \ uf0f4'' \ uf015'これらは、データベースを上記のように正確に表示してください」。*それが問題です。 '\'、 'u'、' f'、 '0'、' b'、 '1'の文字として格納されている場合、JSONシリアライザはそのバックスラッシュをエスケープして正確に正しいことをしています。そのUnicodeエスケープを処理したい場合は、 'IconCode'文字列に割り当てる前に処理する必要があります。文字列には実際にUnicodeエスケープの文字列ではなく文字が含まれています。 –

+0

'IconCode'変数はどうやって設定していますか? C#リテラルを使用した場合、あなたが投稿したものではなく実際のUnicode文字を取得します。 'Debug.Assert(" \ uf0b1 ".Length == 1)' –

+0

データベースにはUnicodeに関する問題もなく、 'nvarchar'カラムに何かを保存することができます。エスケープシーケンスを実際の文字の代わりに6つの別個の文字として格納すると、*あなたのコードはエスケープシーケンスを最初にエスケープする必要があります。値をUnicode列に格納するだけでいいのですか? –

答えて

0

すべてのコメントのおかげで、私はこれを解決できました。

私は文字コードを取得する必要がありました。 "f0b1"と変換してからデータベースに保存してください。だから私は、余分な財産Iconを追加し、データベースに保存されている文字にコードを変換

int code = int.Parse(activity.IconCode, System.Globalization.NumberStyles.HexNumber); 
activity.Icon = char.ConvertFromUtf32(code); 

:だから私の活動コントローラ、作成、編集で、私は情報hereを使用して、以下を追加しました。私のjsonレスポンスで返されるのはこの文字です。

0

C#言語でstringの値 "\ uf0b1"は、実際には "Unicode文字F0B1をレンダリング"するためのプレースホルダです。文字列がコンパイラ/ランタイムによって評価されるとき、Unicode文字がその場所に挿入されます。

"\ uf0b1"という文字列を実際の文字列に格納するのと同じではなく、1文字ではなく、C#表記を使用してエンコードすると "\\ uf0b1"となります。

+0

この回答は正しくありません。これはプレースホルダではありません。それは*文字*です。その文字列の長さは1でなければなりません。 '\\'、 'u'、' f'、 '0'、' b'、 '1'の文字列はそれだけです。最初のものはエスケープする必要があります。 –

+0

'Debug.Assert(" \ uf0b1 ".Length == 1)' –

+0

はい、コードの観点からは、 "unicode charをレンダリングする"という意味です。 – toadflakz

関連する問題