2011-10-21 4 views
2

現在、RESTサービスにWCFを使用しています。私が遭遇した問題は、辞書である結果をシリアライズすることです。 this postで提案されているラッパークラスを使用して、文字列で表される日付(例:「20.10.2011」)とboolからなる辞書をシリアル化しました。結果をテストすると、次のようになります。辞書をJSONにシリアライズする奇妙な結果

{ 
    "DeparturesResult": 
    { 
     "_x0032_1.10.2011":true, 
     "_x0032_4.10.2011":true, 
     "_x0032_6.10.2011":true, 
     "_x0032_8.10.2011":true, 
     "_x0033_1.10.2011":true 
    } 
} 

..すべてのキーの最初の文字は、UTF-8コードとして書き出されます。文字列の前に文字列を追加すると、この問題は発生しません。ここでは(例えばd21.10.2011)

は、私は辞書をシリアル化するために使用していたコードです: パブリッククラスFlService:IFlService { #region IFlServiceメンバー

public AjaxDictionary<string, bool> Departures(string from, string to, string portFrom, string portTo) 
    { 
     var startDate = DateTime.Today; // DateTime.ParseExact(from, "dd.MM.yyyy", null); 
     var endDate = DateTime.ParseExact(to, "dd.MM.yyyy", null); 
     var client = new Timetables(); 
     var result = client.GetJourneys(startDate, endDate.AddDays(1), portFrom, portTo); 
     var js = result 
      .GroupBy(x => x.DepartureTime.CarResToDateTime()) 
      .Select(x => x.Key) 
      .OfType<DateTime>() 
      .Select(x => x.Date) 
      .Distinct() 
      .ToDictionary(x => x.Date.ToString("dd.MM.yyy"), x => true); 
     return new AjaxDictionary<string, bool>(js); 
    } 

    #endregion 

    #region Nested type: AjaxDictionary 

    [Serializable] 
    public class AjaxDictionary<TKey, TValue> : ISerializable 
    { 
     private readonly Dictionary<TKey, TValue> _dictionary; 

     public AjaxDictionary() 
     { 
      _dictionary = new Dictionary<TKey, TValue>(); 
     } 

     public AjaxDictionary(Dictionary<TKey, TValue> dic) 
     { 
      _dictionary = dic; 
     } 

     public AjaxDictionary(SerializationInfo info, StreamingContext context) 
     { 
      _dictionary = new Dictionary<TKey, TValue>(); 
     } 

     public TValue this[TKey key] 
     { 
      get { return _dictionary[key]; } 
      set { _dictionary[key] = value; } 
     } 

     #region ISerializable Members 

     public void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      foreach (var key in _dictionary.Keys) 
       info.AddValue(key is string ? key as string : key.ToString(), _dictionary[key]); 
     } 

     #endregion 

     public void Add(TKey key, TValue value) 
     { 
      _dictionary.Add(key, value); 
     } 
    } 

    #endregion 
} 

編集:受け入れられたにコメントを追加します答え: これはjavascriptでは当てはまりますが、JSONのようには見えません。シリアライザは、JSONにシリアライズするだけでなく、JSONがjavascriptであることを確認するのに少し狂ったようです。キー名(またはJavaScriptでプロパティ)JSON(またはJavaScript)で、それはそれらをシリアライズした後、それらの文字を入れたため、数値で始めることはできませんので、これはhttps://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON

JSON = null 
    or true or false 
    or JSONNumber 
    or JSONString 
    or JSONObject 
    or JSONArray 

JSONNumber = - PositiveNumber 
      or PositiveNumber 
PositiveNumber = DecimalNumber 
       or DecimalNumber . Digits 
       or DecimalNumber . Digits ExponentPart 
       or DecimalNumber ExponentPart 
DecimalNumber = 0 
      or OneToNine Digits 
ExponentPart = e Exponent 
      or E Exponent 
Exponent = Digits 
     or + Digits 
     or - Digits 
Digits = Digit 
     or Digits Digit 
Digit = 0 through 9 
OneToNine = 1 through 9 

JSONString = "" 
      or " StringCharacters " 
StringCharacters = StringCharacter 
       or StringCharacters StringCharacter 
StringCharacter = any character 
        except " or \ or U+0000 through U+001F 
       or EscapeSequence 
EscapeSequence = \" or \/ or \\ or \b or \f or \n or \r or \t 
       or \u HexDigit HexDigit HexDigit HexDigit 
HexDigit = 0 through 9 
     or A through F 
     or a through f 

JSONObject = { } 
      or { Members } 
Members = JSONString : JSON 
     or Members , JSONString : JSON 

JSONArray = [ ] 
     or [ ArrayElements ] 
ArrayElements = JSON 
      or ArrayElements , JSON 

答えて

5

に見られるような完全なJSONの構文を追加しますJSON形式が正しいことを確認してください。

+0

あなたの答えは、これが起こった原因を最もよく指摘しています。私はいくつかの背景で質問を編集しました。 – pederOverland