dav*_*dem 14 .net wcf serialization json datacontractserializer
我对WCF有点新意,并试图清楚地描述我想要做的事情.
我有一个使用JSON请求的WCF Web服务.我在很大程度上发送/接收JSON很好.例如,以下代码可以正常工作并且符合预期.
JSON发送:
{ "guy": {"FirstName":"Dave"} }
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
这将按预期返回带有"Dave"的JSON对象.问题是我不能总是保证我收到的JSON将与我的DataContract中的成员完全匹配.例如,JSON:
{ "guy": {"firstname":"Dave"} }
Run Code Online (Sandbox Code Playgroud)
将无法正确序列化,因为案例不匹配.guy.FirstName将为null.这种行为是有道理的,但我真的不知道如何解决这个问题.我是否必须在客户端强制使用字段名称,还是有一种方法可以在服务器端进行协调?
一个可能相关的问题:我可以接受并将通用JSON对象序列化为StringDictionary或某种简单的键值结构吗?因此,无论JSON中发送的字段名称是什么,我都可以访问已发送给我的名称和值?现在,我能够读取我收到的数据的唯一方法是它是否与预定义的DataContract完全匹配.
Juo*_*nis 11
这是将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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
顾名思义,数据契约是一组规则。如果您想将消息可靠地映射到操作,则需要遵循这些规则。
为什么不能保证外壳是正确的?如果您只想使用 JavaScript 中的小写标识符,您可以使用该MessageParameter属性 - 但您仍然必须选择一个特定的名称。
从理论上讲,您可以接受原始 JSON 并手动反序列化(只需采用字符串参数并使用任何 JSON 库进行反序列化),但这确实不符合 WCF 的精神。
我认为您真正需要解决的不是数据合同区分大小写的事实,而是 JSON 没有在客户端正确组合的事实。
如果您想在操作中接受原始 JSON 字符串,则将 更改BodyStyle为WebMessageBodyStyle.Bare,并将您的方法签名更改为接受单个字符串参数,该参数将填充客户端发送的任何 JSON 字符串。
请注意,您得到的只是一个字符串,您必须自己进行所有解析和属性映射以及验证和错误处理。这不是我会选择的路线,但如果您愿意承担所涉及的努力和风险,这是一种潜在的选择。
| 归档时间: |
|
| 查看次数: |
15209 次 |
| 最近记录: |