Newtonsoft对象序列化为字符串.应为JObject实例

本文关键字:应为 JObject 实例 字符串 对象 序列化 Newtonsoft | 更新日期: 2023-09-27 17:59:14

嗨,我试图解析这一行JSON,但我在文件中发现了一些类似的行,这就是为什么我想自动执行这一操作,这样我就可以删除无效行,使文件成为有效的读取JSON。问题是JSON在一行中包含多个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.

感谢大家的时间和帮助。

Newtonsoft对象序列化为字符串.应为JObject实例

如果每个对象并排放置,没有空格或任何其他字符,则可以将字符串转换为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);

编辑:查看我的第二个答案。更稳健的解决方案。更现代。并支持dotnet内核内置json序列化程序。

Json.Net

更好的解决方案是,Json.NET有一个内置的功能来满足这种情况。请参阅使用JsonReader 读取多个片段

JsonTextReader具有属性SupportMultipleContent,该属性允许在设置为真时读取连续项目

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

如果你想使用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);
}