为什么我不能在 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"
}
extensions
和 metadata
上的 {
暗示那里有一个 object
,而不仅仅是 string
。为此,您可以使用类似以下内容对其进行反序列化:
JsonConvert.DeserializeObject<Dictionary<string, object>>(s)
但是如果你想访问属性,你也可以这样做:
JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(s)
我正在尝试使用 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"
}
extensions
和 metadata
上的 {
暗示那里有一个 object
,而不仅仅是 string
。为此,您可以使用类似以下内容对其进行反序列化:
JsonConvert.DeserializeObject<Dictionary<string, object>>(s)
但是如果你想访问属性,你也可以这样做:
JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(s)