Json.net - 如何“修复”不完整的JSON?

时间:2017-12-13 02:00:34

标签: .net json json.net

我有一些不完整的JSON有效负载(例如,来自中间传输失败的HTTP连接)。下载的部分有效,但下载可能随时中断。

使用Json.NET,如何推断其余的JSON有效负载?



开玩笑吧。

我真正想要的是(使用Json.NET)尽可能地将我拥有的块转换为有效的JSON。

Json有效载荷的格式先验未知。

这是一个破碎的Json的例子 - 在阅读时注意你的步骤,它突然结束:

var broken = @"[
    {'key':'value'},
    {'Tables': [
        {
            'TableName': 'Table_0',
            'Columns': [
                {
                    'ColumnName': 'Enabled',
                    'DataType': 'String',
                }
            ],
            'Rows': [
                [
                    'False',
                    'getuser'
";

1 个答案:

答案 0 :(得分:2)

每当我需要使用Json.NET获得低级别时,我最终都会使用流读者/编写者。

原来JsonTextWriter有一个魔法属性AutoCompleteOnClose可以添加任何等待的' '结束令牌'当作家关闭时。

var broken = @"[
    {'key':'value'},
    {'Tables': [
        {
            'TableName': 'Table_0',
            'Columns': [
                {
                    'ColumnName': 'Enabled',
                    'DataType': 'String',
                }
            ],
            'Rows': [
                [
                    'False',
                    'getuser',
                    {'fdsa':
";

using (var sw = new StringWriter())
{
    var wr = new JsonTextWriter(sw) 
    { 
        AutoCompleteOnClose = true, //simple - just ask the writer to fill in any missing closing tokens
        Formatting = Newtonsoft.Json.Formatting.Indented 
    };
    using (wr)
    {
        using (var rdr = new JsonTextReader(new StringReader(broken)) { CloseInput = true })
        {
            try
            {
                wr.WriteToken(rdr);
            }
            catch { /* swallow the read error and keep on trucking */ }
        }
    } //json writer is closed now
    Console.WriteLine(sw.ToString());
}

这是它产生的输出:

[
  {
    "key": "value"
  },
  {
    "Tables": [
      {
        "TableName": "Table_0",
        "Columns": [
          {
            "ColumnName": "Enabled",
            "DataType": "String"
          }
        ],
        "Rows": [

          [
            "False",
            "getuser",
            {
              "fdsa": null
            }
          ]
        ]
      }
    ]
  }
]