如何将非JSON对象的字符串版本转换为对象类型?
我正在为这个结构体创建一个自定义的模型绑定器,这样我就可以将它作为查询参数发送:
[Serializable]
[ModelBinder(BinderType = typeof(DiscriminatorTagsBinder))]
public struct DiscriminatorTags : IDiscriminatorTags
{
public DiscriminatorTags(List<int> tags, string discriminator, bool selected)
{
this.Tags = tags;
this.Discriminator = discriminator;
this.Selected = selected;
}
[Required]
public List<int> Tags { get; set; }
[Required]
public string Discriminator { get; set; }
[Required]
public bool Selected { get; set; }
}
粘合剂:
public class DiscriminatorTagsBinder : IModelBinder
{
public DiscriminatorTagsBinder()
{
}
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var modelName = bindingContext.ModelName;
// Try to fetch the value of the argument by name
var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);
var x = JsonSerializer.Deserialize<DiscriminatorTags>(valueProviderResult.FirstValue);
if (valueProviderResult == ValueProviderResult.None)
{
return Task.CompletedTask;
}
bindingContext.ModelState.SetModelValue(modelName, valueProviderResult);
var value = valueProviderResult.FirstValue;
// Check if the argument value is null or empty
if (string.IsNullOrEmpty(value))
{
return Task.CompletedTask;
}
bindingContext.Result = ModelBindingResult.Success(valueProviderResult);
return Task.CompletedTask;
}
}
要反序列化的值实际上不是JSON,而是对象的字符串版本:
“DiscriminatorTags(标签:[1、2、3、4、5、6、7、8、9、10、11、12、13、14、true,discriminator:GroceryItm)”
所以当我这样做的时候,我得到了一个JsonException:var x = JsonSerializer.Deserialize<DiscriminatorTags>(valueProviderResult.FirstValue);
如何将非json字符串转换为DiscriminatorTags
结构类型?
1条答案
按热度按时间cyej8jka1#
这可能听起来很明显,但您必须手动解析字符串。这里没有免费的午餐。像这样的东西可以让你开始:
您需要加强它以防止丢失值等。并使用Regex的编译示例