我对WCF有点陌生,将尝试清楚地描述我要做什么。
我有一个使用JSON请求的WCF Web服务。我在大多数情况下都可以很好地发送/接收JSON。例如,以下代码可以正常运行,并且符合预期。
JSON已发送:
{ "guy": {"FirstName":"Dave"} }
WCF:
[DataContract] public class SomeGuy { [DataMember] public string FirstName { get; set; } } [OperationContract] [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] public string Register(SomeGuy guy) { return guy.FirstName; }
这将按预期返回带有“ Dave”的JSON对象。问题是我无法始终保证我收到的JSON与我的DataContract中的成员完全匹配。例如,JSON:
{ "guy": {"firstname":"Dave"} }
由于大小写不匹配,将无法正确序列化。guy.FirstName将为null。这种行为是有道理的,但是我真的不知道该如何解决。我是否必须在客户端上强制使用字段名称,还是可以在服务器端进行协调?
一个可能相关的问题:我可以接受并将通用JSON对象序列化为StringDictionary或某种简单的键值结构吗?因此,无论在JSON中发送什么字段名称,我都可以访问已发送给我的名称和值?现在,我可以读取接收到的数据的唯一方法是,它是否与预定义的DataContract完全匹配。
这是将json读入字典的另一种方法:
[DataContract] public class Contract { [DataMember] public JsonDictionary Registration { get; set; } } [Serializable] public class JsonDictionary : ISerializable { private Dictionary<string, object> m_entries; public JsonDictionary() { m_entries = new Dictionary<string, object>(); } public IEnumerable<KeyValuePair<string, object>> Entries { get { return m_entries; } } protected JsonDictionary(SerializationInfo info, StreamingContext context) { m_entries = new Dictionary<string, object>(); foreach (var entry in info) { m_entries.Add(entry.Name, entry.Value); } } public void GetObjectData(SerializationInfo info, StreamingContext context) { foreach (var entry in m_entries) { info.AddValue(entry.Key, entry.Value); } } }