我在 WCF 中有一个 Web 服务,其操作需要 JSON 格式的请求和响应。我知道我可以只编写带有我想用 JSON 表示的属性的 C# 对象,但我的问题是 JSON 参数可能会改变。例如,我的方法合同如下:
[WebInvoke(Method = "PUT",
UriTemplate = "users",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
Response PutUserAccount(User user);
User 的参数可能包含任意数量的参数,因此 User 的实例有时可能是:
{
"Name" : "John",
"LastName" : "Doe",
"Email" : "jdoe@gmail.com",
"Username" : "jdoe",
"Gender" : "M"
"Phone" : "9999999"
}
甚至:
{
"Name" : "John",
"LastName" : "Doe",
"Email" : "jdoe@gmail.com",
"Username" : "jdoe",
"FavoriteColor" : "Blue"
}
让一个具有可变数量属性的对象来表示 JSON 文档的最佳方法是什么?
编辑这个类允许我有一个灵活的 JSON 表示,因为我不能使用JObject
WCF (我应该把它作为答案发布吗?):
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace MyNamespace {
[Serializable]
public class Data : ISerializable
{
internal Dictionary<string, object> Attributes { get; set; }
public Data()
{
Attributes = new Dictionary<string, object>();
}
public Data(Dictionary<string, object> data)
{
Attributes = data;
}
protected Data(SerializationInfo info, StreamingContext context)
: this()
{
SerializationInfoEnumerator e = info.GetEnumerator();
while (e.MoveNext())
{
Attributes[e.Name] = e.Value;
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
foreach (string key in Attributes.Keys)
{
info.AddValue(key, Attributes[key]);
}
}
public void Add(string key, object value)
{
Attributes.Add(key, value);
}
public object this[string index]
{
set { Attributes[index] = value; }
get
{
if (Attributes.ContainsKey(index))
return Attributes[index];
else
return null;
}
}
}
}