为什么我不能在 C# 中使用 JsonConvert 将 Neo4jClient 的查询结果(类型字符串)解析为 Dictionary<string, string>

Why can I not parse Neo4jClient's query result (type string) into a Dictionary<string, string> using JsonConvert in C#

我正在尝试使用 JsonConvert.

解析 Neo4jClient 的路径查询结果(字符串类型)

我能够使用此方法解析节点的查询结果:

var _gClient = new GraphClient(new Uri("http://localhost:7474/db/data"));
            _gClient.Connect();

            var result = _gClient.Cypher
                .Match("(n)")
                .Return(n => n.As<string>())
                .Results.ToList();

            result.ForEach(n =>
            {
                var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(n);
                Console.WriteLine("Keys: " + String.Join(",", dict.Keys));
                Console.WriteLine("Values: " + String.Join(",", dict.Values));
            });

然而,当我试图对路径的查询结果做同样的事情时,JsonConvert 的 DeserializeObject 方法不能做同样的事情:

var _gClient = new GraphClient(new Uri("http://localhost:7474/db/data"));
            _gClient.Connect();

            var result = _gClient.Cypher
                .Match("p=(a)-[:ACTED_IN]->(m:Movie {title:'The Matrix'})")
                .Return(p => new
                {
                    Nodes = Return.As<IEnumerable<string>>("EXTRACT(p in nodes(p) | p)"),
                    Relationships = Return.As<IEnumerable<string>>("EXTRACT(p in relationships(p) | p)")
                })
                .Results.ToList();

            foreach (var n in result)
            {
                foreach (var s in n.Nodes)
                {

                    JsonConvert.DeserializeObject<Dictionary<string, string>>(s);
                }
            }

错误是解析值时遇到意外字符:{。路径 'extensions',第 2 行,位置 17.

这是要解析的字符串的一部分:

{
  "extensions": {},
  "metadata": {
    "id": 8,
    "labels": [
      "Person"
    ]
  },

这是否意味着 Json 不能反序列化空括号?如果是的话,有没有其他方法可以解析出这个巨大的结构?

问题是您正在尝试反序列化为 Dictionary<string,string> 但您的 JSON 不是 一个 Dictionary<string,string> 错误关于意外的 { 是因为它是 Dictionary<string,string> 而 JSON 看起来像:

{
  "Key1" : "Value1",
  "Key2" : "Value2"
}

extensionsmetadata 上的 { 暗示那里有一个 object,而不仅仅是 string。为此,您可以使用类似以下内容对其进行反序列化:

JsonConvert.DeserializeObject<Dictionary<string, object>>(s)

但是如果你想访问属性,你也可以这样做:

JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(s)