将Gremlin结果集映射到C#中的类时遇到问题。我试图与属性一起获得顶点。这是代码:
public IList<T> All<T>() where T : class, new()
{
Type type = typeof(T);
string query = "g.V().hasLabel('" + type.Name.ToString().ToLower() + "').valueMap(true)";
var resultSet = _gremlinClient.SubmitAsync<dynamic>(query).Result;
List<T> list = JsonConvert.DeserializeObject<List<T>>(JsonConvert.SerializeObject(resultSet));
return list;
}
这是用户实体,我将其传递给此通用方法。
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
当我运行代码时,在反序列化时会引发错误。
'解析值时遇到意外字符:[。路径'[0] .FirstName',第1行,位置37。'
当我检查它时,我发现JSON字符串的属性值带有方括号,如下所示:
[
{
"id": 0,
"label": "user",
"FirstName": [ "Azhar" ],
"LastName": [ "Rahi" ]
},
{
"id": 3,
"label": "user",
"FirstName": [ "John" ],
"LastName": [ "Doe" ]
}
]
您会看到一些属性带有方括号,例如"FirstName":["Azhar"]
。我已经测试了它没有方括号,并且工作正常。因此发生错误的原因是因为字符串在JSON中表示为数组。
另外,在上述JSON字符串,id
并且label
是由Gremlin.Net自动生成的性质。其余实际上是User
对象属性。我不知道为什么Gremlin在添加属性的同时添加括号Vertex
,是否有可能避免它。
请提出任何解决方案,无论是在Gremlin.Net中,还是通过某种方式更改JSON到类的映射。
因此,回顾一下:您有一些JSON,其某些属性是字符串数组,但是您希望在类中将它们建模为单个字符串,因为数组应该始终只有一个值。
如您所见,默认情况下,Json.Net不会处理此映射。但是您可以使用自定义JsonConverter
来弥合差距。像这样定义转换器:
public class ArrayToSingleStringConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
switch (token.Type)
{
case JTokenType.Array:
return (string)token.Children<JValue>().FirstOrDefault();
case JTokenType.String:
return (string)token;
case JTokenType.Null:
return null;
default:
throw new JsonException("Unexpected token type: " + token.Type);
}
}
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后,为类中的每个字符串属性(可能是JSON中的数组)添加一个[JsonConverter]
指定的属性ArrayToSingleStringConverter
,如下所示:
public class User
{
[JsonConverter(typeof(ArrayToSingleStringConverter))]
public string FirstName { get; set; }
[JsonConverter(typeof(ArrayToSingleStringConverter))]
public string LastName { get; set; }
}
当您反序列化JSON时,它现在应该可以按需要工作。
演示小提琴:https : //dotnetfiddle.net/Q9sGja
注意:如果要以这种方式处理所有字符串属性,则可以将转换器传递给,JsonConvert.DeserializeObject()
而不是使用[JsonConverter]
属性标记类:
List<T> list = JsonConvert.DeserializeObject<List<T>>(json, new ArrayToSingleStringConverter());
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句