如何从WCF REST方法返回自定义类型值的字典作为常规JSON对象?

wtlkbnrh  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(118)

假设我有一个自定义类型,看起来像这样:

[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客户端更难解析。

odopli94

odopli941#

这是一个响应@dbc评论的部分解决方案。它导致了这个文件的右形JSON结构。

{"fred":{"HasPaid":false,"Owner":"Fred Millhouse"},"joe":{"HasPaid":false,"Owner":"Joe McWirter"},"bob":{"HasPaid":true,"Owner":"Bob Smith"}}

字符串
但不幸的是,这涉及到必须将方法的返回类型更改为Message。接口变为:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    Message GetDict();
}


而实现就变成了:

using Newtonsoft.Json;
using System.ServiceModel.Channels;
...
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public Message GetDict()
{
    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" });

    string json = JsonConvert.SerializeObject(dict);
    return WebOperationContext.Current.CreateTextResponse(json, "application/json; charset=utf-8", Encoding.UTF8);
}


需要注意的一个有用特性是,与返回Stream不同,当您访问REST方法的URI时,您可以在Web浏览器中轻松查看JSON。

相关问题