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