2011-10-12 19 views
1

當我嘗試使用the ajax appenderjson layoutlog4javascript生成的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); 

回答

3

的問題是JSON log4javascript是生產有一個結尾逗號這裏:

\"message\":[\"Message 1\"], 

...這是無效的,而且有些尷尬,我作爲log4javascript的開發者。

我會盡快解決此問題併發布新版本。

+0

哈哈,太好了 - 謝謝你解決這個問題......我現在可以去睡覺了!我正要爲我的問題添加一些代碼,它與糾正的JSON一起工作,以防將來有人發現它有用(這不是最優雅的方式,但它的工作原理) – glaucon

+0

@glaucon:我發佈了1.4.2解決了這個問題。 –

+0

當你使用第二個構造函數參數爲false的JsonLayout時,這個bug也影響了缺少在日誌消息對象輸出中顯示的customFields。看起來像佈局處理不會將自定義變量合併到日誌消息對象中,但似乎1.4.2也修復了這一點。謝謝 – Traker