运行JsonConvert.DeserializeObject <class>(string)后,为什么我的类对象为空?

时间:2017-10-09 16:54:54

标签: c# json serialization

我正在尝试将JSON字符串反序列化为大对象;我正在使用Angular将我的数据发送到控制器。数据到达控制器时存在且正确,但在反序列化后,它为空。我已经看了一些问题,比如这个问题:

Deserialization of JSON.Net returns 'null'

基于上述问题的答案以及撰写问题的用户的评论,我的代码应该有效,但事实并非如此。

这是我的代码:

[HttpPost]
public OnlineOrderValidation Post(HttpRequestMessage request) 
{
            Task<string> result = request.Content.ReadAsStringAsync();
            var json = result.Result;
            OnlineOrder order = new OnlineOrder();
            order = JsonConvert.DeserializeObject<OnlineOrder>(json);

            // Save first
            _orderFacade.UpdateCurrentOrder(CacheStore, order);

            var validation = _orderFacade.ValidateOrder(order);

            return validation;
}

OnlineOrder类应接受来自JsonConvert.DeserializeObject(json)的所有数据,但值为0,null或false。 我也尝试过DeserializeAnonymousType(字符串json,T anonObject)和JavasScriptSerializer.Deserialize(字符串数据),它们都产生一个空值为null的OnlineOrder对象。

我也试过将对象传递给控制器​​,如下所示:

public OnlineOrderValidation Post([FromBody]string ooJson)
{
    var order = JsonConvert.DeserializeObject<OnlineOrder>(ooJson);
    //work with order object...
}

并且喜欢这个

public OnlineOrderValidation Post([FromUri]string ooJson)
{
    var order = JsonConvert.DeserializeObject<OnlineOrder>(ooJson);
    //work with order object...
}

我想知道问题出在'ReadAsStringAsync()'上。我注意到它无法在OnlineOrder上吐出每个属性。此方法的异步部分必须在完成解析字符串时添加每个字段/值对,并且由于结果中的第一个字段与OnlineOrder对象上的第一个字段不匹配,因此JsonConvert.DeserializeObject()可能会停止执行。 / p>

我是否需要为OnlineOrder创建一个包装类并反序列化?在反序列化之前,是否需要对“结果”对象中的字段重新排序?还有别的我做错了吗?谢谢大家!

编辑:根据要求,这是我的JSON。实际对象比这个大得多,但你明白了。 JSON字符串具有有效数据,但在反序列化后可以为空或归零。

{"isTMIOfferEligible":false,
"tmiOfferCode":null,
"tmiUpgradeOfferCode":null,
"id":"a34mdxdivt0svmu1okucidbi",
"accountNumber":"111111111",
"transferAccountNumber":"222222222",
"serviceAddress":
    {"address":"3922 N STREET AVE",
    "addressLine":"3901 N STREET AVE",
    "suite":"SYNCRD",
    "city":"SOOFOO",
    "state":"SD",
    "zip":"57000",
    "franchise":"111",
    "market":"1        "},
"transferAddress":
    {"disconnectDate":null,
    "transferFromAddress":
        {"address":"1234 SOME PLACE",
        "addressLine":"1234 SOME PLACE",
        "suite":"SYNCRD",
        "city":"SOOFOO",
        "state":"SD",
        "zip":"57000",
        "franchise":"123",
        "market":"Z         "
        }
    }
}

编辑2 我已更新我的代码以从自定义异步方法反序列化JSON字符串,并在分配时实例化OnlineOrder:

            try
        {
            var orderTask = ReadStringAsynchronously(request);
            OnlineOrder order = orderTask.Result;

            //work with order object
        }
        catch (Exception ex) { //...}

        private async Task<OnlineOrder> ReadStringAsynchronously(HttpRequestMessage request)
    {
        try
        {
            var json = await request.Content.ReadAsStringAsync();
            OnlineOrder orderAsync = JsonConvert.DeserializeObject<OnlineOrder>(json);
            return orderAsync;
        }
        catch (Exception)
        {
            throw new Exception("Error occurred while reading string asynchronously.");
        }
    }

任务上的订单对象仍为空。

1 个答案:

答案 0 :(得分:0)

在这种情况下,问题出在JSON字符串本身。在JSON字符串中嵌套了未编码的HTML。在发布到服务器之前,我在自定义方法中使用了encodeURIComponent(value):

array_append(sort_col, 999)

我可以通过在请求正文中发布对象来获取有效数据到服务器。