【问题标题】:POST JSON Dictionary without Key/Value Text没有键/值文本的 POST JSON 字典
【发布时间】:2011-12-03 23:59:58
【问题描述】:

我有一个类似这样的 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"}}

有没有办法做到这一点?

【问题讨论】:

标签: c# json wcf serialization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        在此处http://www.newtonsoft.com/json 免费提供,也可作为 NuGet 包提供。

        我发现它比现有的 JSON 序列化器灵活得多。

        此外,您的 URITemplate 似乎是空的。我没有使用包裹体样式,但是对于裸体样式,您需要填充 URITemplate。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-10
          • 2014-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多