WCF服务无法返回对象列表的JSON

时间:2015-01-26 15:02:09

标签: c# json wcf

我有一个如下定义的对象。从我的WCF服务我可以返回一个没有问题的List,但是当我尝试返回Json时,它返回零字节。没错。

我在这个项目中有大约80个其他方法没有问题,但是这个方法根本就没有转换。我可以将Serializer更改为NewtonSoft,但这已接近该项目的结束。我以前从未见过这个问题。

我的objectX如下,有什么我错过的吗?

public class objectX
    {
        public string CompanyName { get; set; }
        public string Username { get; set; }
        public string BranchName { get; set; }
        public Nullable<decimal> Amount { get; set; }
        public int Id { get; set; }
        public int ClientId { get; set; }
        public int UserId { get; set; }
        public int TypeId { get; set; }
        public int Credits { get; set; }
        public System.DateTime InvoiceDate { get; set; }
        public string Notes { get; set; }
        public Nullable<int> LinkedId { get; set; }
        public string Status { get; set; }
        public Nullable<System.DateTime> DateProcessed { get; set; }
        public Nullable<int> ProcessedBy { get; set; }
        public int BranchId { get; set; }
        public Nullable<System.DateTime> CreatedOn { get; set; }
        public Nullable<int> CreatedBy { get; set; }
        public Nullable<System.DateTime> ModifiedOn { get; set; }
        public Nullable<int> ModifiedBy { get; set; }
  }

这是合同:

    [OperationContract]
    [WebInvoke(Method = "GET",
    UriTemplate = "objectX/Read/{clientId}/{branchId}/{statuses}/{dateTime}",
    ResponseFormat = WebMessageFormat.Json)]
    List<objectX> objectXRead(string clientId, string branchId, string statuses, string dateTime);

3 个答案:

答案 0 :(得分:1)

我认为Serializer没有任何问题,我有Web API项目,我在这里使用你的对象是我在控制器中的方法

public List<objectX> GetObjectX()
    {
        return new List<objectX>() { new objectX() { CompanyName = "c1", BranchName = "b1" },
        new objectX() { CompanyName = "c2", BranchName = "b2" }};
    }

public class objectX
    {
        public string CompanyName { get; set; }
        public string Username { get; set; }
        public string BranchName { get; set; }
        public Nullable<decimal> Amount { get; set; }
        public int Id { get; set; }
        public int ClientId { get; set; }
        public int UserId { get; set; }
        public int TypeId { get; set; }
        public int Credits { get; set; }
        public System.DateTime InvoiceDate { get; set; }
        public string Notes { get; set; }
        public Nullable<int> LinkedId { get; set; }
        public string Status { get; set; }
        public Nullable<System.DateTime> DateProcessed { get; set; }
        public Nullable<int> ProcessedBy { get; set; }
        public int BranchId { get; set; }
        public Nullable<System.DateTime> CreatedOn { get; set; }
        public Nullable<int> CreatedBy { get; set; }
        public Nullable<System.DateTime> ModifiedOn { get; set; }
        public Nullable<int> ModifiedBy { get; set; }
    }

我的结果低于结果。

[{&#34;公司名称&#34;:&#34; C1&#34;&#34;用户名&#34;:空,&#34; BRANCHNAME&#34;:&#34; B1&#34 ;,&#34;量&#34;:空,&#34;标识&#34;:0,&#34;客户端Id&#34;:0,&#34;用户ID&#34;:0,&#34; TYPEID&#34;:0,&#34;现金&#34;:0,&#34; InvoiceDate&#34;:&#34; 0001-01-01T00:00:00&#34;&#34;注释&# 34;:空,&#34; LinkedId&#34;:空,&#34;状态&#34;:空,&#34; DateProcessed&#34;:空,&#34; ProcessedBy&#34;:空,& #34; BranchId&#34;:0,&#34; CreatedOn&#34;:空,&#34; CreatedBy&#34;:空,&#34; ModifiedOn&#34;:空,&#34; ModifiedBy&#34 ;日期null},{&#34;公司名称&#34;:&#34; C2&#34;&#34;用户名&#34;:空,&#34; BRANCHNAME&#34;:&#34; B2&# 34;,&#34;量&#34;:空,&#34;标识&#34;:0,&#34;客户端Id&#34;:0,&#34;用户ID&#34;:0,&#34 ; TYPEID&#34;:0,&#34;现金&#34;:0,&#34; InvoiceDate&#34;:&#34; 0001-01-01T00:00:00&#34;&#34;备注& #34;:空,&#34; LinkedId&#34;:空,&#34;状态&#34;:空,&#34; DateProcessed&#34;:空,&#34; ProcessedBy&#34;:空, &#34; BranchId&#34;:0,&#34; CreatedOn&#34;:空,&#34; CreatedBy&#34;:空,&#34; ModifiedOn&#34;:空,&#34; ModifiedBy&#34;:空}]

如果配置有一些限制,请检查您的配置。

希望这有帮助。

答案 1 :(得分:0)

看看这里:

How do I return clean JSON from a WCF Service?

我相信你并没有告诉WCF如何通过合同中的属性返回数据。你不能告诉我们WCF合同是什么样的。

答案 2 :(得分:0)

我已经找到导致这个问题的原因,尽管这对我没有意义。填充对象的数据来自azure db(sql server)。在一个proc中,InvoiceDate被设置为错误的最小日期(它被错误地从空值保存并转换为01/01/1001 00:00)。尽管仍然是一个真正的日期时间,并且它作为真正的日期时间存储在内存中的对象中,只有当它作为真实日期发送到数据库时,才能以JSON格式返回对象。

我看不出为什么会出现这种情况。数据从proc返回01/01/01 00:00,这是一个真正的日期时间值,因此我希望c#可以这样处理它。即使在进行测试检查以查看从proc返回的日期是&lt; = DateTime.Min(c#),并在代码中将其设置为DateTime.Min(再次)时,它也可以工作。但直截了当的演员&#39;从01/01/01 00:00的db值到datetime不起作用。

更令人困惑的是,它在测试中以XML格式返回,没有任何问题。

感谢@Mitesh提示我设置一个简单的测试,以便发现这个&#39;。