我正在构建 WCF REST 服务,并且我注意到当我将带有冒号的 JSON 对象作为键名传递并尝试将这些对反序列化为字典时,什么也没有发生。REST 服务中的反序列化执行没有错误,但是包含冒号的 JSON 对象中对应的键名的对象字段不会被反序列化。
我发现问题出在 DataContractJsonSerializer 和自定义字典类上。我在这里找到了可序列化的字典Generic WCF JSON Deserialization),它只是不想用冒号解析键。
这是一个例子
void Main()
{
var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(
@"{ ""a:b:c"": ""adfsfsf"", ""res"": 123, ""dict"": { ""a:b"": ""va"", ""b"": ""vb"" } }"));
var ser = new DataContractJsonSerializer(typeof(A));
var a = (A)ser.ReadObject(stream);
a.Dump();
}
[DataContract]
class A
{
[DataMember(Name = "a:b:c")]
public string AF { get; set; }
[DataMember(Name = "res")]
public int Res { get; set; }
[DataMember(Name = "dict")]
public JsonDictionary Dict { get; set; }
}
// NOTE: Code from https://stackoverflow.com/questions/2297903/generic-wcf-json-deserialization
[Serializable]
public class JsonDictionary : ISerializable
{
private Dictionary<string, string> m_entries;
public JsonDictionary()
{
m_entries = new Dictionary<string, string>();
}
public IEnumerable<KeyValuePair<string, string>> Entries
{
get { return m_entries; }
}
protected JsonDictionary(SerializationInfo info, StreamingContext context)
{
m_entries = new Dictionary<string, string>();
foreach (var entry in info)
{
m_entries.Add(entry.Name, (string)entry.Value);
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
foreach (var entry in m_entries)
{
info.AddValue(entry.Key, entry.Value);
}
}
}
结果,我得到了一个带有填充字段 a:b:c 和 res 的 A 实例。但在字典中我只得到 1 对(它是 b/vb)。并且 a:b/va 这对只是不出现在结果字典中。如果我将 a:b 重命名为 a。然后 a/va 出现在字典中。
有什么问题?