将包含字符串数组的 Gremlin 结果映射到包含简单字符串属性的 C# 类



我在将 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;
}

这是 User 实体,我将其传递给此泛型方法。

public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}

当我运行代码时,它在反序列化时抛出错误。

'解析值时遇到意外字符:[。路径 '[0]。名字",第 1 行,位置 37。

当我检查它时,我发现 JSON 字符串具有带方括号的属性值,如下所示:

[
{
"id": 0,
"label": "user",
"FirstName": [ "Azhar" ],
"LastName": [ "Rahi" ]
},
{
"id": 3,
"label": "user",
"FirstName": [ "John" ],
"LastName": [ "Doe" ]
}
]

您可以看到某些属性具有方括号,例如"FirstName":["Azhar"]。我已经在没有方括号的情况下对其进行了测试,并且工作正常。因此,错误的原因是因为字符串在 JSON 中表示为数组。

在上面的 JSON 字符串中,idlabel是按 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 中的数组(,添加一个指定ArrayToSingleStringConverter[JsonConverter]属性,如下所示:

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());

小提琴:https://dotnetfiddle.net/gcAqC5

相关内容

  • 没有找到相关文章

最新更新