处理JObject和JArray的区别

4
我有一个方法,它接收这个参数:
List<QueueItem> signups

这是一个类:

public class QueueItem
{
  public string Everything{ get; set; } //all the fields in one string 
...
}

每个键值对对象都有一个包含所有字段的字符串,如下所示...

[{
  "Key": "Partner",
  "Value": "Place"
}, {
  "Key": "FIRST_NAME",
  "Value": "John"
}, {
  "Key": "last_name",
  "Value": "Smith"
}]

但是这一行...
var result = signups.Select(x => JsonConvert.DeserializeObject<JObject>(x.Everything));

返回以下错误信息:

"无法将类型为 'Newtonsoft.Json.Linq.JArray' 的对象转换为类型 'Newtonsoft.Json.Linq.JObject'"

我看到的解决方法是不要转换为 JObject,而是保留为 JArray,但这需要改变检查 Properties() 等 JObject 特定内容的方法。我希望能够将 json 作为 JObject 处理并保持其他内容不变。是否有一种有效的方法来实现这一点?

因为后面我会经常检查 JObject 特定属性,如下所示...

var Properties = result.Select(x => x.Properties()).ToArray();

3
我会使用 JToken.Parse 方法,并根据需要将返回的 JToken 强制转换。JTokenJObjectJArray 的基类。 - Heretic Monkey
Parse接收JSON字符串作为输入。该JSON是一个对象列表,其中包含一个带有所有字段的字符串。我难道不需要先进行DeserializeObject()吗?这又回到了最初的问题? - John
1
请[编辑]您的问题,包括Everything中的示例。基本上,如果您可以成功执行Deserialize<JObject>(x.Everything),那么您可以成功执行JToken.Parse(x.Everything)并获得类似的结果。 - Heretic Monkey
我刚刚添加了Everything的内容。 - John
好的,正如错误提示所示([]是提示),它应该反序列化为 JArray。由于数组没有任何真正有趣的属性,你可能需要遍历 JArray 才能玩得开心。不知道你想用结果做什么,很难回答这个问题。 - Heretic Monkey
如果出于某种原因需要使用JsonConvert.DeserializeObject,例如传递JsonSerializerSettings,则可以始终执行JsonConvert.DeserializeObject<JToken>(x.Everything, settings) - dbc
1个回答

1

如果直接反序列化为 List<KeyValuePair<string, string>>,会怎样呢:

var pairs = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(x.Everything);
foreach(var kvp in pairs)
{
    Console.WriteLine($"Key: {kvp.Key}");
    Console.WriteLine($"Value: {kvp.Value}");
}

KeyValuePair文档


针对键值对对象,相当于.Properties()的等效方法是什么? - John
@John 编辑以展示访问键值对属性的示例。 - Christo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接