JSON反序列化疑难解答

时间:2011-04-28 03:24:39

标签: .net wcf json

我查看了有关反序列化的最新帖子:

但是使用提供的故障排除方法,我无法解决当前的问题。看起来我不是唯一一个无法找到经过验证的方法的人,所以我希望解决方案可以帮助很多人。我甚至搜索过Safari Books Online,我得到的总体印象是JSON支持仅适用于Silverlight。

目前我不考虑转移到JSON.net,除非它是实现我的目标的唯一方法:将JSON对象发布到.NET WCF Web服务并更新数据库中的相应记录。我遵循了Service Monitor跟踪,netmon跟踪等,它们都显示我的服务端点似乎没有将JSON输入传递给我声明的用于解析单个JSON属性的方法。

我的运营合同:

//Update Ticket
        [OperationContract]
        [WebInvoke(Method = "PUT",
            UriTemplate = "UpdateTicket",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        TimeTicket UpdateTicket(TimeTicket t);

我的数据合同:

[Serializable]
[DataContract]
public class TimeTicket
{
    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string Project { get; set; }

    [DataMember]
    public int Hours { get; set; }

    [DataMember]
    public DateTime Date { get; set; }
}

处理JSON数据的方法的部分内容。它在“where x.ID == t.ID”行失败,因为t是一个空对象:

    public TimeTicket UpdateTicket(TimeTicket t)
    {
        MWAEntities db = new MWAEntities();

        var tick = (from x in db.TEST_TimeTicket
                    where x.ID == t.ID
                    select new TimeTicket
                    {
                        ID = x.ID,
                        Project = x.project,
                        Hours = x.hours,
                        Date = x.date
                    }).FirstOrDefault();

在执行期间,我正在使用curl(在Mac OS X上)发送JSON数据,如下所示:

curl -X PUT http://mywebserver:8000/UpdateTicket -d '{"ID":1,"Project":"Project A-edit2","Hours":32,"Date":"\/Date(1301630400000-0400)\/"}' -H "Content-Type:application/json" -v

详细输出:

* About to connect() to mywebserver port 8000 (#0)
*   Trying 192.168.210.218... connected
* Connected to mywebserver (192.168.210.218) port 8000 (#0)
> PUT /UpdateTicket HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3
> Host: mywebserver:8000
> Accept: */*
> Content-Type:application/json
> Content-Length: 85

Netmon跟踪显示服务器收到我传递的JSON。

有没有办法确定我的JSON发生了什么以及处理数据的最佳做法?谢谢你的教育!

1 个答案:

答案 0 :(得分:1)

Chad_C,嗨。

我认为您的JSON有效负载应为:

'{"t":{"ID":1,"Project":"Project A-edit2","Hours":32,"Date":"\/Date(1301630400000-0400)\/"}}'

是你的TimeTicket(UpdateTicket(TimeTicket t))