一尘不染

通用WCF JSON反序列化

json

我对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完全匹配。


阅读 228

收藏
2020-07-27

共1个答案

一尘不染

这是将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);
            }
        }
    }
2020-07-27