假设我有一个自定义类型,看起来像这样:
[DataContract]
public class CompositeType
{
[DataMember]
public bool HasPaid
{
get;
set;
}
[DataMember]
public string Owner
{
get;
set;
}
}
字符串
还有一个WCF REST接口,看起来像这样:
[ServiceContract]
public interface IService1
{
[OperationContract]
Dictionary<string, CompositeType> GetDict();
}
型
那么我如何让我的方法的实现返回一个JSON对象,看起来像这样.
{"fred":{"HasPaid":false,"Owner":"Fred Millhouse"},"joe":{"HasPaid":false,"Owner":"Joe McWirter"},"bob":{"HasPaid":true,"Owner":"Bob Smith"}}
型
我不想让它看起来像这样:
[{"Key":"fred","Value":{"HasPaid":false,"Owner":"Fred Millhouse"}},{"Key":"joe","Value":{"HasPaid":false,"Owner":"Joe McWirter"}},{"Key":"bob","Value":{"HasPaid":true,"Owner":"Bob Smith"}}]
型
理想情况下,我宁愿不改变方法的返回类型。
我尝试了许多不同的方法,但都没有找到一个有效的解决方案。令人烦恼的是,用Newtonsoft.Json
在一行中生成右形状的JSON对象结构很容易:
string json = JsonConvert.SerializeObject(dict);
型
其中dict
定义为:
Dictionary<string, CompositeType> dict = new Dictionary<string, CompositeType>();
dict.Add("fred", new CompositeType { HasPaid = false, Owner = "Fred Millhouse" });
dict.Add("joe", new CompositeType { HasPaid = false, Owner = "Joe McWirter" });
dict.Add("bob", new CompositeType { HasPaid = true, Owner = "Bob Smith" });
型
但我不想从我的WCF方法返回一个字符串。这是因为它隐藏了返回的真实的类型;也因为WCF序列化字符串,导致转义双引号和其他丑陋的东西,使非.Net REST客户端更难解析。
1条答案
按热度按时间odopli941#
这是一个响应@dbc评论的部分解决方案。它导致了这个文件的右形JSON结构。
字符串
但不幸的是,这涉及到必须将方法的返回类型更改为
Message
。接口变为:型
而实现就变成了:
型
需要注意的一个有用特性是,与返回
Stream
不同,当您访问REST方法的URI时,您可以在Web浏览器中轻松查看JSON。