Use JSON.NET to generate JSON schema with extra attributes

后端 未结 5 2134
鱼传尺愫
鱼传尺愫 2020-12-28 08:28

I am using JSON.NET to generate JSON Schema from c# object class. But I was unable to add any other json schema attributes e.g. maxLength, pattern(regex to validate email),

5条回答
  •  渐次进展
    2020-12-28 08:34

    You can create custom JsonConverter something like this. I used reflection to fill out properties.

      public class UserConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var user = (User)value;
            var result = new StringBuilder("{");
    
            result.Append("title : " + user.GetType().Name + ", ");
            result.Append("properties : {");
    
            foreach (var prop in user.GetType().GetProperties())
            {
                result.Append(prop.Name + ": {");
                result.Append("value : " + Convert.ToString(prop.GetValue(user, null)) + ", ");
    
                var attribute = (JsonPropertyAttribute)Attribute.GetCustomAttributes(prop)[0];
                if (attribute.Required == Required.Always)
                    result.Append("required : true, ");
    
                result.Append("type : " + prop.PropertyType.Name.ToLower());
                result.Append(" }");
            }
            writer.WriteValue(result.ToString());
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var user = new User { UserName = (string)reader.Value };
    
            return user;
        }
    
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(User);
        }
    
    }
    

    [JsonConverter(typeof(UserConverter))]
    public class User
    {
        [JsonProperty(Required = Required.Always)]
        public string UserName { get; set; }
    }
    
    //Run  
    string json = JsonConvert.SerializeObject(manager, Formatting.Indented);
    
    Console.WriteLine(json);
    

提交回复
热议问题