嗨所以我正在尝试解析这个JSON行,但我在文件中得到了一些其他类似的东西,这就是为什么我想自动化这个,所以我可以删除无效的行,使文件成为有效的JSON进行读取,问题是JSON在1行中包含多个JSON
示例:
{"item":"value"}{"anotheritem":"value"}
无论如何要删除
{"anotheritem":"value"}
因此,它会转换为可读的有效JSON,以开始解析文件
我尝试使用StreamReader,因为在一个文件中我有多个包含这些无效JSON的文件
所以我得到它能够检测到无效的JSON,但由于某种原因我不能让它读取JSON所以我可以使用.remove删除无效的行
using (StreamReader r = new StreamReader(itemDir))
{
string json = r.ReadToEnd();
if (json.Contains("anotheritem"))
{
JObject NoGood = JObject.FromObject(json);
MessageBox.Show(NoGood.ToString());
}
}
错误:
Object serialized to String. JObject instance expected.
谢谢大家的时间和帮助。
答案 0 :(得分:4)
如果每个对象并排,没有空格或任何其他字符,则可以将字符串转换为json数组。
string value = "{\"item\":\"value\"}{\"anotheritem\":\"value\"}";
string arrayValue = "["+value.Replace("}{", "},{") + "]";
var array = JArray.Parse(arrayValue);
var goopArray = array.OfType<JObject>().Where(o => o.Property("anotheritem") == null);
答案 1 :(得分:0)
即使是更好的解决方案,Json.NET也具有针对此确切场景的内置功能。参见Read Multiple Fragments With JsonReader
JsonTextReader
具有属性SupportMultipleContent
,当设置为true时,该属性允许读取连续的项
string value = "{\"item\":\"value\"}{\"anotheritem\":\"value\"}";
var reader = new JsonTextReader(new System.IO.StringReader(value));
reader.SupportMultipleContent = true;
var list = new List<JObject>();
while (reader.Read())
{
var item = JObject.Load(reader);
list.Add(item);
}
如果您想使用System.Text.Json
,也可以实现。它们不是SupportMultipleContent
属性,但Utf8JsonReader
将为您完成这项工作。
string value = "{\"item\":\"value\"}{\"anotheritem\":\"value\"}";
var bytes = Encoding.UTF8.GetBytes(value).AsSpan();
var list = new List<JsonDocument>();
while (bytes.Length != 0)
{
var reader = new Utf8JsonReader(bytes);
var item = JsonDocument.ParseValue(ref reader);
list.Add(item);
bytes = bytes.Slice((int) reader.BytesConsumed);
}