将包含字符串数组的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;
}

这是用户实体,我将其传递给此通用方法。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章