没有键/值文本的POST JSON字典

时间:2011-12-03 23:59:59

标签: c# json wcf serialization

我有一个类似的WCF端点:

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, UriTemplate = "")]
Stream DoWork(Dictionary<string, string> items);

为了将任何内容传递给我的服务,我必须构建我的JSON:

{"items":[{"Key":"random1","Value":"value1"}, {"Key":"random2","Value":"value2"}]}

我真正希望它看起来像这样:

{"items":{"random1":"value1","random2":"value2"}}

有没有办法实现这个目标?

4 个答案:

答案 0 :(得分:4)

您可以选择将DoWork参数更改为字符串,然后在方法中使用Json反序列化器将其转换为适当的格式吗?

答案 1 :(得分:0)

我一直在寻找相同的解决方案。我设法通过使用'JavaScriptSerializer'来实现它。您必须将函数输出设置为“Stream”而不是“String”。

Public Function hotel_availability(ByVal data1 As Stream) As Stream Implements IMyTestAPI.hotel_availability
....
Dim serializer As New JavaScriptSerializer()
Dim serializedResult = serializer.Serialize(a_response)
Dim json = Encoding.UTF8.GetBytes(serializedResult)
Dim a_result as  New MemoryStream(json)
WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8"

return a_result

答案 2 :(得分:0)

您基本上需要一个SerializableDynamic对象,因此您的方法将如下所示:

[OperationContract]
[WebInvoke(...)]
Stream DoWork(SerializableDynamicObject items);

您可以在此处查看有关如何从字典构建SerializableDynamic对象的良好指南:(请参阅Solution部分)。希望这会有所帮助...

答案 3 :(得分:-1)

使用Newtonsoft JSON序列化程序可能会有更好的成功。

这里免费提供http://www.newtonsoft.com/json,也可以作为NuGet包使用。

我发现它比股票JSON序列化器更灵活。

此外,看起来你的URITemplate是空的。我没有使用包裹的身体风格,但是裸露的身体风格需要填充URITemplate。