當我嘗試使用the ajax appender和json layout對log4javascript生成的JSON blob進行反序列化時,我得到'invalid JSON primitive「。.ASMX奇怪反序列化log4javascript日誌記錄中的JSON blob?
我寫了一個Web服務方法收到由log4javascript發送的JSON,但JSON被宣告無效,當.NET嘗試反序列化,我不明白爲什麼一個異常拋出。
的JS設置是這樣的:
var requestURL = (
$.url.build({
"path": "ClientSideLoggingSupport.asmx/Log"
})
);
var requestURLEncoded = $.url.encode(requestURL)
var log4js = log4javascript.getLogger();
var ajaxAppender = new log4javascript.AjaxAppender(requestURLEncoded);
ajaxAppender.setLayout(new log4javascript.JsonLayout(false, false));
log4js.addAppender(ajaxAppender);
log4js.info("Message 1");
「日誌」的方法是這樣的:
S在上述方法的值看起來像這只是異常前拋出:
"[{\"logger\":\"[anonymous]\",\"timestamp\":1318394483187,\"level\":\"INFO\",\"url\":\"http://localhost:19019/Logon.aspx\",\"message\":[\"Message 1\"],}]"
這在我看來就像一個合理的字符串來養活解串器,但顯然它不是!任何人都知道我(或log4javascript)做錯了什麼?
OK我已經意識到一些關於我的代碼是錯誤的,但固定實際上並沒有解決問題。
JSON代表一個對象數組,因此接收反序列化結果的對象需要一個字典列表。所以我修改了反序列化代碼如下:
//Alter instantion of JavaScriptSerializer
JavaScriptSerializer jsss = new JavaScriptSerializer();
//Request Deserialization presuming a list of dictionaries
List<Dictionary<string, string>> xx = jsss.Deserialize<List<Dictionary<string, string>>>(nvcss["data"]);
所以這是,我相信更好,但仍然會拋出同樣的異常。
對於什麼是值得我現在有方法中的下面這行代碼,它執行罰款,所以它看起來越來越彷彿它是JSON通過log4javascript這就需要以某種方式調整
List<Dictionary<string, string>> o = jsss.Deserialize<List<Dictionary<string, string>>>("[{'a':1,'b':2},{'a':10,'b':20}]");
任何建議生產歡迎。
注意到的是,JSON的「消息」屬性後(的一種)更多進展是本身的陣列我暫時改變「消息」,以便它的定標器。通過這種方式,JSON看起來是這樣的:
List<Dictionary<string, string>> ooo = jsss.Deserialize<List<Dictionary<string, string>>>("[{\"logger\":\"[anonymous]\",\"timestamp\":1318394483187,\"level\":\"INFO\",\"url\":\"http://localhost:19019/Logon.aspx\",\"message\":\"Message 1\"}]");
...這是然後能夠執行這樣好像問題是,JSON有一個嵌入式陣列等不同的目標對象將需要指定爲了成功反序列化JSON。
Final edit!感謝Tim發現了JSON中的缺陷,我現在已經有了一個工作版本。我假裝JSON正在做正確的事情,然後以相當不合時宜的方式丟棄消息負載,但它可能對未來某個人有用。
List<Dictionary<string, object>> lstMsg = jsss.Deserialize<List<Dictionary<string, object>>>("[{\"logger\":\"[anonymous]\",\"timestamp\":1318394483187,\"level\":\"INFO\",\"url\":\"http://localhost:19019/Logon.aspx\",\"message\":[\"Message 1\"]}]");
string sOut = "";
foreach (Dictionary<string, object> m in lstMsg)
{
sOut = sOut + m["timestamp"];
foreach(string sMessage in (ArrayList)m["message"])
{
sOut = sOut + "|" + sMessage;
}
}
_NLogLogger.Info("sOut:" + sOut);
哈哈,太好了 - 謝謝你解決這個問題......我現在可以去睡覺了!我正要爲我的問題添加一些代碼,它與糾正的JSON一起工作,以防將來有人發現它有用(這不是最優雅的方式,但它的工作原理) – glaucon
@glaucon:我發佈了1.4.2解決了這個問題。 –
當你使用第二個構造函數參數爲false的JsonLayout時,這個bug也影響了缺少在日誌消息對象輸出中顯示的customFields。看起來像佈局處理不會將自定義變量合併到日誌消息對象中,但似乎1.4.2也修復了這一點。謝謝 – Traker