【问题标题】:Parsing non-standard JSON解析非标准 JSON
【发布时间】:2012-01-29 12:56:36
【问题描述】:

有人知道下面的代码是什么类型的 JSON(即使是这样!)?我正在从网站的 HTML 中检索它。我正在尝试使用 JSON 解析器在 C# 中解析它,但我必须进行大量准备性编辑才能根据 JSONLint 将其格式化为“有效”JSON。例如,变量的名称都应该有双引号,而不是根本没有引号。

{
status: 'A',
displayed: 'Y',
start_time: '2010-11-2600: 00: 00',
start_time_xls: {
    en: '26thofNov201000: 00am',
    es: '26Nov201000: 00am'
},
suspend_at: '2010-11-2619: 57: 59',
is_off: 'Y',
score_home: '',
score_away: '',
bids_status: '',
period_id: '',
curr_period_start_time: '',
score_extra_info: '',
ev_id: 2257335,
blurb: '',
last_mkts_of_day: false,
follow_hcap_mkt: 10999896
}

这将始终具有相同的格式,我很乐意将其直接解析为 C# 或 java 中的对象。

【问题讨论】:

  • 那不是 JSON,是原生 JS 对象。
  • 在我看来,有人推出了自己的 JSON 发射器,但细节错误。
  • 这不是 HTML 也不是 JSON。它是 JavaScript(授予,在 HTML 脚本标签中)。
  • JSON 可解析字符串:jsfiddle.net/yb5Pb
  • 一本不错的入门书:stackoverflow.com/questions/6489783/…

标签: c# java javascript json string-parsing


【解决方案1】:

您可以使用Json.Net 来解析您的输入字符串。你甚至可以在this extension class 的帮助下使用dynamic (用你的字符串测试)

dynamic obj = JsonUtils.JsonObject.GetDynamicJsonObject(jsonstr);
Console.WriteLine(obj.names.en);
Console.WriteLine(obj.status);
Console.WriteLine(obj.start_time_xls.en);
Console.WriteLine(obj.suspend_at);

用纯 Json.Net

JObject jObj =  (JObject)JsonConvert.DeserializeObject(json3);
Console.WriteLine(jObj["names"]["en"]);
Console.WriteLine(jObj["status"]);
Console.WriteLine(jObj["start_time_xls"]["en"]);
Console.WriteLine(jObj["suspend_at"]);

【讨论】:

    【解决方案2】:

    JSON 要求所有名称都用双引号引起来,因此这不是有效的 JSON。这是一个有效的 Javascript 对象。对于 JSON 格式的问题,请访问:http://json.org/

    不完全清楚你想在哪里进行 JSON 转换,但在 Javascript 中你可以使用 window.JSON.stringify 将其转换为 JSON。

    演示:http://jsfiddle.net/ThinkingStiff/3xZD8/

    var object = {
        names: {
            en: 'VirtualMarket-2MinuteLevel',
            es: 'VirtualMarket-2MinuteLevel'
        },
        status: 'A',
        displayed: 'Y',
        start_time: '2010-11-2600: 00: 00',
        start_time_xls: {
            en: '26thofNov201000: 00am',
            es: '26Nov201000: 00am'
        },
        suspend_at: '2010-11-2619: 57: 59',
        is_off: 'Y',
        score_home: '',
        score_away: '',
        bids_status: '',
        period_id: '',
        curr_period_start_time: '',
        score_extra_info: '',
        ev_id: 2257335,
        blurb: '',
        last_mkts_of_day: false,
        follow_hcap_mkt: 10999896
        },
        json = window.JSON.stringify( object );
    

    【讨论】:

    • 有什么解决办法吗?也许这作为评论会更好。
    【解决方案3】:

    无论(我投“不”)它是否有效:

    • 读入字符串;
    • s {^\s*([a-z0-9_]+)\:} {"\1":} g

    似乎适用于这个数据集,我敢打赌他们只是strcat向你输出,所以暂时可能是安全的。

    【讨论】:

    • 我刚刚在笔记本电脑上通过 Perl 运行了它;但它只是为了简单地引用“键”值——你可能(在 C# 中)会做一些事情,你将两个 {} 表达式传递给“搜索”和“替换”方法......没有大括号。 (我的手机无法输入插入符号或反斜杠,但从插入符号复制到 : 并且可能在反斜杠和双引号之前添加额外的反斜杠)
    • 现在我在一个真正的键盘前,我相信 C# 语法将是 Regex.Replace (json_string, "^\\s*(<l>[a-z0-9_]+)\\:", "\"${l}\"");(使用 <l> 作为“标签”的命名标签和 ${l} 而不是 @ 987654326@回参考)
    猜你喜欢
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2017-12-31
    • 2011-12-08
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多