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

我有一个类似这样的WCF端点:

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

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

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

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

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

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

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

我一直在寻找相同的解决方案。 我设法通过使用’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 

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

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

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

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

它可以在http://www.newtonsoft.com/json免费获得,也可以作为NuGet包提供。

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

此外,看起来你的URITemplate是空的。 我没有使用包裹的身体样式,但是在裸体样式中你需要填充URITemplate。