[英]JSON WCF Deserialization DataContracts
我有一個DataContract
,我正在嘗試從WCF服務接收的JSON中反序列化。 我能夠獲取根DeviceID
和TimeStamp
進行反序列化而沒有問題,但是,我無法獲取任何GeoLocations
或Videos
和VideoFrames
進行反序列化。
我已經環顧了四周,從我發現這應該行得通。 我已經對一些DataContact
屬性進行了一些調整,以嘗試實現此目的,但還是沒有運氣。
我正在將此JSON發送到WCF Web服務。
{
"DeviceId": "74a5f7aa9d4dfd0d",
"TimeStamp": 1394756724,
"GeoLocations": [
{
"TimeStamp": 1394756724,
"Latitude": 948.348275,
"Longitude": 381.3252
},
{
"TimeStamp": 1394756726,
"Latitude": 98.348275,
"Longitude": 31.3252
}
],
"Videos": [
{
"VideoFrames": [
{
"TimeStamp": 1234567789,
"Base64EncodedFrame": "dajflahfaskfasld"
},
{
"TimeStamp": 1234567789,
"Base64EncodedFrame": "dajflahfaskfasld"
}
]
}
]
}
Web服務界面看起來像這樣。
[OperationContract]
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "json")]
String JSONData();
Web服務嘗試將對象反序列化為該模型。
[DataContract(Namespace="")]
public class VideoFrame
{
[Key]
public int VideoFrameId { get; set; }
[DataMember(Order = 0, IsRequired = false)]
public int TimeStamp { get; set; }
[DataMember(Order = 1, IsRequired = false)]
public string Base64EncodedFrame { get; set; }
}
[DataContract(Namespace = "")]
public class Video
{
[Key]
public int VideoId { get; set; }
[DataMember(Order = 0, IsRequired = false)]
public virtual List<VideoFrame> VideoFrames { get; set; }
}
[DataContract(Namespace="")]
public class GeoLocation
{
[Key]
public int GeoLocationId { get; set; }
[DataMember(Order = 0, IsRequired = true)]
public int TimeStamp { get; set; }
[DataMember(Order = 1, IsRequired = true)]
public double Latitude { get; set; }
[DataMember(Order = 2, IsRequired = true)]
public double Longitude { get; set; }
}
[DataContract(Name="root", Namespace="")]
public class DeviceUpdate
{
[Key, Column(Order = 0)]
[DataMember (Order=0, IsRequired=true)]
public string DeviceId { get; set; }
[Key, Column(Order = 1)]
[DataMember(Order=1, IsRequired=true)]
public int TimeStamp { get; set; }
[DataMember(Order = 2, IsRequired = true)]
public virtual List<GeoLocation> GeoLocations { get; set; }
[DataMember(Order = 3, IsRequired = true)]
public virtual List<Video> Videos { get; set; }
}
Web服務代碼為:
DeviceUpdate dataObject = OperationContext.Current.RequestContext.RequestMessage.GetBody<DeviceUpdate>();
Webconfig:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>
<system.serviceModel>
<services>
<service name="BugsBunny.RestService" behaviorConfiguration="ServiceBehavior">
<endpoint address="" binding="webHttpBinding" contract="BugsBunny.IRestService" behaviorConfiguration="web"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="true" />
</system.webServer>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
<system.web>
<customErrors mode="Off"/>
</system.web>
</configuration>
這也可能會有所幫助,在JSON復活后,我提取了它嘗試處理的實際XML:
<root type="object">
<DeviceId type="string">74a5f7aa9d4dfd0d</DeviceId>
<TimeStamp type="number">1394756724</TimeStamp>
<GeoLocations type="array">
<item type="object">
<TimeStamp type="number">1394756724</TimeStamp>
<Latitude type="number">948.348275</Latitude>
<Longitude type="number">381.3252</Longitude>
</item>
<item type="object">
<TimeStamp type="number">1394756726</TimeStamp>
<Latitude type="number">98.348275</Latitude>
<Longitude type="number">31.3252</Longitude>
</item>
</GeoLocations>
<Videos type="array">
<item type="object">
<VideoFrames type="array">
<item type="object">
<TimeStamp type="number">1234567789</TimeStamp>
<Base64EncodedFrame type="string">dajflahfaskfasld</Base64EncodedFrame>
</item>
<item type="object">
<TimeStamp type="number">1234567789</TimeStamp>
<Base64EncodedFrame type="string">dajflahfaskfasld</Base64EncodedFrame>
</item>
</VideoFrames>
</item>
</Videos>
</root>
好的,我找到了一種使這項工作成功的方法。
我已將Web服務實現更改為:
DeviceUpdate dataObject = OperationContext.Current.RequestContext.RequestMessage.GetBody<DeviceUpdate>(new DataContractJsonSerializer(typeof(DeviceUpdate)));
並添加:
RequestFormat = WebMessageFormat.Json
服務接口屬性。
這允許所有對象填充在數據聯系人中。
謝謝大家的幫助。
在這里,您將不會獲得地理位置,因為BodyStyle裸機不包含名稱空間,而包裝程序則包含名稱空間,因此您還可以獲取其他屬性。
嘗試這個
[OperationContract]
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "/json")]
String JSONData();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.