【问题标题】:Parsing comma-separated JSON file [duplicate]解析逗号分隔的 JSON 文件 [重复]
【发布时间】:2019-02-04 06:53:38
【问题描述】:

我正在尝试使用 Json.NET 解析逗号分隔的 JSON 对象文件:

{
   JSON ...
},
{
   JSON ...
},
{
   JSON ...
}

如果流不包含分隔符(即上面的逗号被删除),下面的代码可以正常工作。但是,逗号会产生一个无限循环,即使在到达文件末尾之后,Json.NET 也会继续读取“未定义”令牌:

  using (StreamReader fReader = File.OpenText("filename.json"))
  using (JsonTextReader jReader = new JsonTextReader(fReader))
  {
    jReader.SupportMultipleContent = true;
    while (jReader.Read())
    {
      var jToken = JToken.ReadFrom(jReader);
      if (jToken is JObject)
        Console.WriteLine("JSON object: " + ((JObject)jToken).ToString());
    }
  }

我尝试通过提前阅读并使用 JsonTextReader 的 Skip() 方法来跳过逗号,但这不起作用:JsonTextReader 显然会提前缓冲,吃掉逗号,导致消化不良。

很难相信我会是第一个遇到这个问题的人,但是尽管在这里搜索了很多,但我还没有找到任何相关的帖子(至少对于 C# 和 Json.NET)。真的有必要从头开始破解吗?

ETA:根据下面 Brian Rogers 的评论,Json.NET 11.0.1 及更高版本处理逗号分隔的 JSON,所以上面的现在可以正常工作,不管逗号与否。

【问题讨论】:

  • 对我来说听起来像是XY problem。最好不要一开始就生成无效的 JSON 文件。
  • 是的,但是这些文件来自我无法控制的外部来源(我意识到它们格式不正确)。如果有更好的方法,我会非常乐意放弃我尝试过的解决方案。
  • 升级到 Json.Net 11.0.1 或更高版本。它支持您使用阅读器上的SupportMultipleContent 设置尝试执行的操作。请参阅链接的重复问题的第二个答案。

标签: json json.net jsonparser


【解决方案1】:

解决此问题的一种方法是将其列在列表中。例如,可以在“逗号分隔的Json”的任一端添加“[”“]”,将其转换为列表,然后进行反序列化。

例如,考虑下面的代码,它有一个用逗号分隔的 Json 对象(为了简单起见,创建了一个简单的 json,但也可以工作)

var jsonString = @"{User:'anu viswan', Location:'India'},{User:'User2', Location:'India'}";

如果在任一端添加“[”“]”,然后对其进行序列化,则可以获得 RootObjects 的集合。

var result = JsonConvert.DeserializeObject<RootObject[]>($"[{jsonString}]");

在这种特殊情况下,RootObject 被定义为

public class RootObject
{
    public string User { get; set; }
    public string Location { get; set; }
}

您可以类似地将 Json 转换为基于您的 Object 定义的集合。

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 2011-09-08
    • 2019-03-08
    • 2011-02-26
    相关资源
    最近更新 更多