解析逗号分隔的JSON文件

时间:2019-02-03 08:14:42

标签: json json.net jsonparser

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

  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());
    }
  }

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

{{1}}

我尝试通过先阅读并使用JsonTextReader的Skip()方法来跳过逗号,但这是行不通的:JsonTextReader显然在前面缓冲了,吃掉了逗号,这使其消化不良。

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

ETA:根据Brian Brians在下面的评论,Json.NET 11.0.1及更高版本可处理以逗号分隔的JSON,因此无论是否使用逗号,以上内容现在都可以正常工作。

1 个答案:

答案 0 :(得分: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转换为集合。