JsonConvert.DeserializeObject导致对象的空值

时间:2017-06-27 21:00:12

标签: json json.net asp.net-web-api2

我将一些JSON从一个Web API传递到另一个Web API。在第一个API中,我序列化了对象,结果字符串看起来很好。当调用进入第二个API时,我在将JSON反序列化为对象时逐步执行该方法。

接收控制器内部:

string inputs = req.Content.ReadAsStringAsync().Result;

JSON字符串(inputs变量)如下所示:(是的,这是在Text可视化工具中查看的):

{"LogEntry":"{\"Id\":0,\"AppName\":\"MyTestController\",\"LogMessage\":\"this is a test\",\"ServerName\":\"dev-test3\",\"LoggedOnDate\":\"2017-06-27T15:37:28.1691783-05:00\",\"LogType\":1}"}

现在我尝试使用以下命令将JSON反序列化回我的对象​​(LogEntry):

LogMgr.LogEntry logentry = JsonConvert.DeserializeObject<LogMgr.LogEntry>(inputs);

我在LogEntry字段中获取空值。

这是我的POCO类LogEntry:

public class LogEntry
{
    public int Id { get; set; }
    public string AppName { get; set; }
    public string LogMessage { get; set; }
    public string ServerName { get; set; }
    public DateTime LoggedOnDate { get; set; }
    public int LogType { get; set; }
}

出了点问题,但我无法看到。好像我之前在JSON数据中遇到转义字符问题。

在反序列化步骤中我可以检查什么?

1 个答案:

答案 0 :(得分:2)

这里有两个问题。

  1. 在我看来,您的第一个API是对日志条目进行双重序列化。最有可能发生这种情况,因为您手动将控件方法中的条目序列化,然后将JSON字符串插入另一个对象,然后当从方法返回时,Web API会自动序列化对象(因为它的设计目的),导致双序列化日志条目。

  2. 另一方面,您正在尝试将此JSON反序列化为LogEntry类,但您没有考虑它周围的包装器对象。由于所有数据在JSON中都是一个级别,因此它与您尝试反序列化的类不匹配,并且所有内容最终都为空。

  3. 解决问题的最佳方法是更改​​第一个API,使其不会手动序列化日志条目,然后直接返回它而不将其包装在另一个对象中。如果你这样做,那么你最终应该得到如下所示的JSON:

    {
      "Id": 0,
      "AppName": "MyTestController",
      "LogMessage": "this is a test",
      "ServerName": "dev-test3",
      "LoggedOnDate": "2017-06-27T15:37:28.1691783-05:00",
      "LogType": 1
    }
    

    这应该反序列化到你的LogEntry课程中。