.ASMX weirdness从log4javascript日志反序列化JSON blob?

.ASMX weirdness从log4javascript日志反序列化JSON blob?,javascript,c#,json,log4javascript,Javascript,C#,Json,Log4javascript,当我尝试反序列化通过使用with生成的JSON blob时,得到的是“无效JSON基元” 我已经编写了一个web服务方法来接收log4javascript发送的JSON,但是JSON被声明为无效,并且在.NET尝试对其进行反序列化时引发异常,我不理解为什么 JS设置如下所示: var requestURL = ( $.url.build({ "path": "ClientSideLoggingSupport.asmx/Log" }) ); var reque

当我尝试反序列化通过使用with生成的JSON blob时,得到的是“无效JSON基元”

我已经编写了一个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");
[WebMethod(Description = "Accepts a request to log client side information")]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)]
public void Log()
{
    try
    {
        System.Collections.Specialized.NameValueCollection nvcss = this.Context.Request.Form;
        var jss = new JavaScriptSerializer();
        string s = nvcss["data"].ToString();
        Dictionary<string, string> x = jss.Deserialize<Dictionary<string, string>>(nvcss["data"].ToString());

        var dict = jss.Deserialize<Dictionary<string, string>>(nvcss["data"]);
        _NLogLogger.Info("The logging web service was invoked");
    }
    catch (Exception ex)
    {
        _NLogLogger.Error("Some sort of problem occurred1");
        _NLogLogger.Error(String.Format("Ex.Message = {0}", ex.Message));
        _NLogLogger.Error(String.Format("Ex.Source = {0}", ex.Source));
        _NLogLogger.Error(String.Format("Ex.StackTrace = {0}", ex.StackTrace));
        _NLogLogger.Error(String.Format("Ex.InnerException = {0}", ex.InnerException));
        throw;
    }
}
“log”方法如下所示:

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");
[WebMethod(Description = "Accepts a request to log client side information")]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)]
public void Log()
{
    try
    {
        System.Collections.Specialized.NameValueCollection nvcss = this.Context.Request.Form;
        var jss = new JavaScriptSerializer();
        string s = nvcss["data"].ToString();
        Dictionary<string, string> x = jss.Deserialize<Dictionary<string, string>>(nvcss["data"].ToString());

        var dict = jss.Deserialize<Dictionary<string, string>>(nvcss["data"]);
        _NLogLogger.Info("The logging web service was invoked");
    }
    catch (Exception ex)
    {
        _NLogLogger.Error("Some sort of problem occurred1");
        _NLogLogger.Error(String.Format("Ex.Message = {0}", ex.Message));
        _NLogLogger.Error(String.Format("Ex.Source = {0}", ex.Source));
        _NLogLogger.Error(String.Format("Ex.StackTrace = {0}", ex.StackTrace));
        _NLogLogger.Error(String.Format("Ex.InnerException = {0}", ex.InnerException));
        throw;
    }
}
在我看来,这似乎是一个看似合理的字符串,以饲料反序列化,但显然不是!有人知道我(或log4javascript)做错了什么吗


好的,我已经意识到我的代码有些地方是错误的,但是修复它并不能真正解决问题

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"]);
//JavaScriptSerializer的Alter实例
JavaScriptSerializer jsss=新的JavaScriptSerializer();
//假定字典列表,请求反序列化
List xx=jsss.Deserialize(nvcss[“数据]);
因此,我认为这是更好的,但仍然抛出相同的例外

值得一提的是,我现在在方法中有下面一行代码,它执行得很好,因此它看起来越来越像是log4javascript生成的JSON,需要以某种方式进行调整

List<Dictionary<string, string>> o = jsss.Deserialize<List<Dictionary<string, string>>>("[{'a':1,'b':2},{'a':10,'b':20}]");
List o=jsss.Deserialize(“[{'a':1,'b':2},{'a':10,'b':20}]”);
欢迎任何建议


在注意到JSON的“message”属性本身就是一个数组之后,我临时更改了“message”,使其成为一个scaler。通过这种方式,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\"}]");
List ooo=jsss.反序列化(“[{”logger\“:\”[anonymous]\”,“timestamp\”:1318394483187,\“level\”:“INFO\”,“url\”:\”http://localhost:19019/Logon.aspx\“,\“message\”:\“message 1\”}]”;
。。。然后就可以执行了,所以问题似乎是JSON有一个嵌入式数组,所以需要指定不同的目标对象才能成功地反序列化JSON


最终编辑多亏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);
List lstMsg=jssshttp://localhost:19019/Logon.aspx\“,\“message\”:[\“message 1\”]}]”;
字符串sOut=“”;
foreach(lstMsg中的字典m)
{
sOut=sOut+m[“时间戳”];
foreach(字符串sMessage in(ArrayList)m[“message”])
{
sOut=sOut+“|”+sMessage;
}
}
_NLogLogger.Info(“sOut:+sOut”);

问题在于,JSON log4javascript正在生成的代码后面有一个逗号:

\"message\":[\"Message 1\"],
。。。这是无效的,对于作为log4javascript开发人员的我来说有点尴尬


我将尽快修复此问题并发布新版本。

哈哈,太好了-感谢您解决此问题。。。我现在可以睡觉了!我只是想在我的问题中添加一些代码,这些代码可以与正确的JSON一起工作,以防将来有人发现它有用(这不是最优雅的方式,但它可以工作)@glaucon:我发布了1.4.2来修复这个问题。这个错误还影响了当您使用JsonLayout时,当第二个构造函数参数为false时,日志消息对象输出中没有显示customFields。布局处理似乎不会将自定义变量合并到日志消息对象中,但1.4.2似乎也解决了这一问题。谢谢