配置WCF数据协定以获得正确的JSON响应

时间:2014-05-17 17:00:18

标签: json vb.net wcf datacontract

我经营过一些Bed&早餐网站并运行一种预订引擎,以帮助客户直接在他们的网站上预订(而不是去另一个网站完成交易)。

我正在使用ASP.NET WCF创建一个Web服务,以创建关于我管理的酒店的房间可用性的JSON响应。我已将Web服务配置为在JSON中序列化响应。一切都运行得很好除了我不能构造适当的对象来获得我想要的JSON响应。

为了正确进行切换,我需要返回以下列方式构建的JSON响应:

{
"api_version" : 10 ,
"lang" : "en_US",
"hotels" :
    [
        {
            "name" : "Example Hotel",
            "email" : "concierge@example.com",
            "phone" : "555-555-5555",
            "fax" : "555-555-5555",
            "room_types"  :
                {
                    "Orchid Room" :
                        {
                            "url" : "http://hotel.com/orchid",
                            "desc" : "One queen bed etc."
                        },
                    "Presidential Suite" :
                        {
                            "url" : "http://hotel.com/predidential",
                            "desc" : "One king bed etc."
                        }
                }
        }
    ]
}

配置我的WCF服务以返回JSON序列化中的对象没有问题。然而,我感到困惑的是如何构建" room_types"对象的一部分。现在,问题是,对于我系统中的每个酒店,我将有不同的房间类型,所以我需要以某种方式动态生成room_types对象。但我不知道如何正确地构造物体。

以下是我到目前为止设置的数据合约,它们没有正确地序列化为JSON:

<DataContract()>
Public Class InventoryResponseObject
        <DataMember(order:=0)> Public Property api_version As Integer
        <DataMember(order:=1)> Public Property lang As String
        <DataMember(order:=2)> Public Property hotels As hotelsObject
        <DataMember(order:=3)> Public Property errors As List(Of String)

End Class

<CollectionDataContract()>
Public Class hotelsObject
        Inherits List(Of HotelObject)
        Public Sub New()
        End Sub

End Class

<DataContract()>
Public Class HotelObject
        <DataMember(order:=0)> Public Property name As String
        <DataMember(order:=1)> Public Property email As String
        <DataMember(order:=2)> Public Property phone As String
        <DataMember(order:=3)> Public Property fax As String
        <DataMember(order:=4)> Public Property room_types As RoomTypeCollectionObject

End Class

<DataContract()>
Public Class RoomTypeInfoObject
        <DataMember(order:=0)> Public Property url As String
        <DataMember(order:=1)> Public Property desc As String

End Class

<CollectionDataContract()>
Public Class RoomTypeCollectionObject
        Inherits List(Of RoomTypeInfoObject)
        Public Sub New()
        End Sub

End Class

这将产生以下不正确的JSON resopnse:

{
"api_version" : 10 ,
"lang" : "en_US",
"hotels" :
    [
        {
            "name" : "Example Hotel",
            "email" : "concierge@example.com",
            "phone" : "555-555-5555",
            "fax" : "555-555-5555",
            "room_types"  :[
                        {
                            "url" : "http://hotel.com/orchid",
                            "desc" : "One queen bed etc."
                        },
                        {
                            "url" : "http://hotel.com/predidential",
                            "desc" : "One king bed etc."
                        }
                ]
        }
    ]
}

我很难过。任何援助都将非常感激。

2 个答案:

答案 0 :(得分:0)

在&#34;适当&#34;的样本中json,room_types不是集合属性。在json格式中,集合用[]括起来,就像你在第二个&#34;错误&#34;样品。这意味着你的room_types实际上是一个具有两个属性的对象&#34; Orchid Room&#34;和#34;总统套房&#34;。请注意,通过设置DataMember属性的Name属性,可以实现具有空间的属性名称:<DataMember(Name:="Orchid Room")>

答案 1 :(得分:0)

好的,我找到了解决方案。它需要两个步骤:

  1. 使用ExpandoObject动态地向room_types对象添加属性
  2. 使用Newtonsoft.Json序列化返回对象并强制服务返回纯文本