C# JSON WCF反序列化数据契约

C# JSON WCF反序列化数据契约,c#,json,web-services,wcf,datacontract,C#,Json,Web Services,Wcf,Datacontract,我有一个DataContract,我正试图从某个从WCF服务接收的JSON反序列化它。我可以获取根设备ID和时间戳进行反序列化,而不会出现问题,但是,我无法获取任何地理位置或视频和视频帧进行反序列化 我已经环顾了很多地方,从我所能找到的,这应该是可行的。为了实现这一点,我对一些DataContact属性进行了一些调整,但仍然没有成功 我将此JSON发送到WCF web服务 { "DeviceId": "74a5f7aa9d4dfd0d", "TimeStamp": 1394756

我有一个
DataContract
,我正试图从某个从WCF服务接收的JSON反序列化它。我可以获取根
设备ID
时间戳
进行反序列化,而不会出现问题,但是,我无法获取任何
地理位置
视频
视频帧
进行反序列化

我已经环顾了很多地方,从我所能找到的,这应该是可行的。为了实现这一点,我对一些
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; }
}
[DataContract(Namespace=”“)]
公共级视频帧
{
[关键]
public int VideoFrameId{get;set;}
[数据成员(顺序=0,IsRequired=false)]
公共int时间戳{get;set;}
[数据成员(顺序=1,IsRequired=false)]
公共字符串Base64EncodedFrame{get;set;}
}
[DataContract(名称空间=”)]
公开课视频
{
[关键]
public int VideoId{get;set;}
[数据成员(顺序=0,IsRequired=false)]
公共虚拟列表视频帧{get;set;}
}
[DataContract(名称空间=”)]
公共类地理定位
{
[关键]
public int GeoLocationId{get;set;}
[数据成员(顺序=0,IsRequired=true)]
公共int时间戳{get;set;}
[数据成员(顺序=1,IsRequired=true)]
公共双纬度{get;set;}
[数据成员(顺序=2,IsRequired=true)]
公共双经度{get;set;}
}
[DataContract(Name=“root”,Namespace=”“)]
公共类设备更新
{
[键,列(顺序=0)]
[数据成员(顺序=0,IsRequired=true)]
公共字符串设备ID{get;set;}
[键,列(顺序=1)]
[数据成员(顺序=1,IsRequired=true)]
公共int时间戳{get;set;}
[数据成员(顺序=2,IsRequired=true)]
公共虚拟列表地理位置{get;set;}
[数据成员(顺序=3,IsRequired=true)]
公共虚拟列表视频{get;set;}
}
web服务代码为:

DeviceUpdate dataObject = OperationContext.Current.RequestContext.RequestMessage.GetBody<DeviceUpdate>();
DeviceUpdate dataObject=OperationContext.Current.RequestContext.RequestMessage.GetBody();
网络配置:

<?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>

74a5f7aa9d4dfd0d
1394756724
1394756724
948.348275
381.3252
1394756726
98.348275
31.3252
1234567789
dajflahfaskfaskld
1234567789
dajflahfaskfaskld

此处您将无法获取地理位置,因为BodyStyle bare不包含名称空间,而wrapped包含名称空间,因此您还可以获取其他属性

试试这个

[OperationContract]
[WebInvoke(Method = "POST",
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "/json")]
String JSONData();

在这里,您将无法获取地理位置,因为BodyStyle bare不包含名称空间,而wrapped包含名称空间,因此您还可以获取其他属性

试试这个

[OperationContract]
[WebInvoke(Method = "POST",
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "/json")]
String JSONData();

在这里,您将无法获取地理位置,因为BodyStyle bare不包含名称空间,而wrapped包含名称空间,因此您还可以获取其他属性

试试这个

[OperationContract]
[WebInvoke(Method = "POST",
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "/json")]
String JSONData();

在这里,您将无法获取地理位置,因为BodyStyle bare不包含名称空间,而wrapped包含名称空间,因此您还可以获取其他属性

试试这个

[OperationContract]
[WebInvoke(Method = "POST",
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "/json")]
String JSONData();

好的,我已经找到了一种方法来实现这一点

我已将web服务实现更改为:

DeviceUpdate dataObject = OperationContext.Current.RequestContext.RequestMessage.GetBody<DeviceUpdate>(new DataContractJsonSerializer(typeof(DeviceUpdate)));
到服务接口属性

这允许在数据联系人中填充所有对象


谢谢大家的帮助。

好的,我已经找到了一种方法来实现这一点

我已将web服务实现更改为:

DeviceUpdate dataObject = OperationContext.Current.RequestContext.RequestMessage.GetBody<DeviceUpdate>(new DataContractJsonSerializer(typeof(DeviceUpdate)));
到服务接口属性

这允许在数据联系人中填充所有对象


谢谢大家的帮助。

好的,我已经找到了一种方法来实现这一点

我已将web服务实现更改为:

DeviceUpdate dataObject = OperationContext.Current.RequestContext.RequestMessage.GetBody<DeviceUpdate>(new DataContractJsonSerializer(typeof(DeviceUpdate)));
到服务接口属性

这允许在数据联系人中填充所有对象


谢谢大家的帮助。

好的,我已经找到了一种方法来实现这一点

我已将web服务实现更改为:

DeviceUpdate dataObject = OperationContext.Current.RequestContext.RequestMessage.GetBody<DeviceUpdate>(new DataContractJsonSerializer(typeof(DeviceUpdate)));
到服务接口属性

这允许在数据联系人中填充所有对象


谢谢大家的帮助。

太棒了!我看了很多遍这段代码,只是一直在看。不幸的是,这还不足以解决问题。地理位置仍然是空的。我也对OP做了修改。太棒了!我看了很多遍这段代码,只是一直在看。不幸的是,这还不足以解决问题。地理位置仍然是空的。我也对OP做了修改。太棒了!我看了很多遍这段代码,只是一直在看。不幸的是,这还不足以解决问题。地理位置仍然是空的。我也对OP做了修改。太棒了!我看了很多遍这段代码,只是一直在看。不幸的是,这还不足以解决问题。地理位置仍然是空的。我也对OP做了修改。