在 .NET 中使用 Jayrock 不正确地形成 JSON 字符串

Posted

技术标签:

【中文标题】在 .NET 中使用 Jayrock 不正确地形成 JSON 字符串【英文标题】:JSON String formed improperly using Jayrock in .NET 【发布时间】:2010-04-05 15:06:18 【问题描述】:

我正在尝试使用 Jayrock.JSON 从 aspx 页面返回 JSON 对象。 我写出来的代码是这样的:

using (JsonTextWriter writer = new JsonTextWriter(Response.Output))
    
        writer.WriteStartObject();
        for (int i = 0; i < rdr.FieldCount; i++)
        
            writer.WriteMember(rdr.GetName(i).ToString());
            writer.WriteString(rdr[i].ToString());
        
        writer.WriteEndObject();
    

这是在 rdr.Read() 循环内。

输出的 JSON 如下所示:(虽然我手动添加了换行符)


"BugID":"1087",
"AddedBy":"",
"BugDate":"5/2/2010 9:45:34 AM",
"BugTitle":"/admin/ajax_thirdpartylog.asp",
"Classify":""
,"ErrPage":"/admin/ajax_thirdpartylog.asp",
"StoreID":"71",
"UserID":"15438",
"ErrDesc":"Type mismatch: 'formatnumber'",
"ErrDump":"*** VARIABLES DUMP ***\r\n\r\n*** Form Variables ***\r\n\r\ncalmonth : 8\r\ncalmonth2 : 8\r\nfromdate : 8/1/2009\r\ncalyear : 2009\r\ntodate : 8/31/2009\r\ncalyear2 : 2009\r\nr : 978402\r\nthirdtype : 1\r\nButton : Generate Third Party Log\r\n\r\n*** Query String Variables ***\r\n\r\n\r\n\r\n*** REPORT END ***\r\n",
"ErrLine":"74",
"DateFixed":"",
"Counter":"16",
"AssignTo":""
 
 
"BugID":"1086",
"AddedBy":"",
"BugDate":"5/1/2010 11:58:54 PM",
"BugTitle":"/admin/Charts/monthsales_s.asp",
"Classify":"",
"ErrPage":"/admin/Charts/monthsales_s.asp",
"StoreID":"402",
"UserID":"141928",
"ErrDesc":"Script timed out",
"ErrDump":"*** VARIABLES DUMP ***\r\n\r\n*** Form Variables ***\r\n\r\n\r\n*** Query String Variables ***\r\n\r\nmonth1 : 9/1/2009\r\nr : 75333803\r\n\r\n\r\n*** REPORT END ***\r\n",
"ErrLine":"0",
"DateFixed":"",
"Counter":"",
"AssignTo":""
 

我不太确定自己做错了什么,但是在我阅读此 JSON 的页面上,当我尝试执行 .evalJSON(使用prototypejs)时,我收到错误消息,指出 JSON 格式错误。 谁能告诉我要改变什么?

【问题讨论】:

【参考方案1】:

这个:

"AssignTo":"" 
  
  

是无效的 JSON。您可以在JSON Lint 处查看字符串是否为有效 JSON。我不确定这应该是什么样子,但是一个空对象应该是这样的(不需要“”,括号颠倒,缺少逗号):

"AssignTo": 
  
 , 

【讨论】:

知道如何使用 JayRock.JSON 输出吗? 不,不是很遗憾。 rdr 的定义是什么样的?对我来说,问题似乎是这个代码:rdr[i].ToString() 被调用,rdr[i] 是一个对象,这不是你所期望的。在这种情况下,您需要另一个循环,或者您可以更改方法以在遇到对象时递归循环。但我没有使用 JayRock.JSON,所以这只是一个猜测。 作为参考,当您有多个对象时,使用 JayRock.JSON 您必须遵循此过程:WriteStartObject() WriteMember("SOME UNIQUE ID TO IDENTIFY EACH OBJECT") WriteStartArray() WriteStartObject() // For each object WriteMembers and WriteStrings of object WriteEndObject() WriteEndArray() WriteEndObject() 编辑:我不知道如何在评论中正确格式化。【参考方案2】:

问题是您正在编写多个 JSON 对象,而您可能尝试做的是生成 JSON 对象的 JSON 数组。鉴于您的代码 sn-p,我假设 rdr 拥有一些 IDataReader 实现,例如 SqlDataReader。如果是这样,那么您需要修改代码以围绕外部 read 循环开始和结束 JSON 数组,如下所示:

using (JsonTextWriter writer = new JsonTextWriter(Response.Output))
        
    writer.WriteStartArray();
    while (rdr.Read())
    
        writer.WriteStartObject();
        for (int i = 0; i < rdr.FieldCount; i++)
        
            writer.WriteMember(rdr.GetName(i).ToString());
            writer.WriteString(rdr[i].ToString());
        
        writer.WriteEndObject();
    
    writer.WriteEndArray();

在 JSON 数组中时,Jayrock 将自动用逗号 (,) 分隔每个 JSON 对象值,因此现在输出应类似于以下有效 JSON:

[
    
        "BugID":"1087",
        "AddedBy":"",
        "BugDate":"5/2/2010 9:45:34 AM",
        "BugTitle":"/admin/ajax_thirdpartylog.asp",
        "Classify":""
        ,"ErrPage":"/admin/ajax_thirdpartylog.asp",
        "StoreID":"71",
        "UserID":"15438",
        "ErrDesc":"Type mismatch: 'formatnumber'",
        "ErrDump":"*** VARIABLES DUMP ***\r\n\r\n*** Form Variables ***\r\n\r\ncalmonth : 8\r\ncalmonth2 : 8\r\nfromdate : 8/1/2009\r\ncalyear : 2009\r\ntodate : 8/31/2009\r\ncalyear2 : 2009\r\nr : 978402\r\nthirdtype : 1\r\nButton : Generate Third Party Log\r\n\r\n*** Query String Variables ***\r\n\r\n\r\n\r\n*** REPORT END ***\r\n",
        "ErrLine":"74",
        "DateFixed":"",
        "Counter":"16",
        "AssignTo":""
    ,
    
        "BugID":"1086",
        "AddedBy":"",
        "BugDate":"5/1/2010 11:58:54 PM",
        "BugTitle":"/admin/Charts/monthsales_s.asp",
        "Classify":"",
        "ErrPage":"/admin/Charts/monthsales_s.asp",
        "StoreID":"402",
        "UserID":"141928",
        "ErrDesc":"Script timed out",
        "ErrDump":"*** VARIABLES DUMP ***\r\n\r\n*** Form Variables ***\r\n\r\n\r\n*** Query String Variables ***\r\n\r\nmonth1 : 9/1/2009\r\nr : 75333803\r\n\r\n\r\n*** REPORT END ***\r\n",
        "ErrLine":"0",
        "DateFixed":"",
        "Counter":"",
        "AssignTo":""
    
]

【讨论】:

以上是关于在 .NET 中使用 Jayrock 不正确地形成 JSON 字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jayrock 返回对象

msvc visual c++从静态成员函数中不正确地形成绑定成员函数表达式

Jayrock:未导出 Web 方法

Jayrock 导出到字符串的替代方案

jqGrid - 如何配置 jsonreader(与 Jayrock 一起使用)?

通过JayRock将json与IronPython结合使用