0

私は 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 が辞書に表示されます。

何が間違っている可能性がありますか?

4

0 に答える 0