Newtonsoft对象序列化为String。期望JObject实例

时间:2016-07-29 08:38:32

标签: c# json

嗨所以我正在尝试解析这个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.

谢谢大家的时间和帮助。

2 个答案:

答案 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

即使是更好的解决方案,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

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