在绑定到.net核心控制器中的对象之前转换JSON



我试图绑定JSON,这是来自一个源我无法控制,在一个控制器的自定义类。我遇到的问题是,值数组以格式[{'value':' value1'}, [{'value':'value2'}]发送。我知道我可以创建一个对象,它将有一个字段'value'和绑定将工作,但我想避免这种情况,并得到所有的值从请求绑定到字符串列表。

我有这个控制器方法

public async Task<IActionResult> UploadData(List<DataModel> values) 

下面是我想要的数据模型的样子。

public class DataModel
{
public string? a{ get; set; }
public List<string>? b{ get; set; }
} 

这里是data

的例子
[{
"a": "name",
"b": [
{
"value": "one"
}, 
{
"value": "two"
}
]
}]

是否有一种方法来实现这一点,最好使用属性?

让绑定对象保持原样,从无法控制的源映射,并为对象创建一个自定义getter,以便在列表中进行转换。使用automapper或其他建议的第三方库会增加不必要的复杂性。

public class DataModel
{
public string? a { get; set; }
public List<ObjectFromSource> b{  get; set; }
[NonSerialized]
public string getb()
{
//returns a string list
return string.Join(",", b.Select(x => x.value));
}
}
public class ObjectFromSource
{
public string? value { get; set; }
}

那么当你需要周围的值时你只需调用

DataModel x = new DataModel();
x.getb();

最简单的方法是更改动作输入参数类型

public async Task<IActionResult> UploadData(JArray jArr) 
{
List<DataModel> values = jArr.Select(ja => new DataModel { a = (string)ja["a"], 
b = ja["b"].Select(b => (string)b["value"]).ToList() }).ToList();
//your code
}
另一种方法是使用JsonConstructor
public class DataModel
{
public string? a { get; set; }
public List<string>? b { get; set; }
[Newtonsoft.Json.JsonConstructor]
public DataModel (JArray b)
{
this.b= b.Select(b => (string)b["value"]).ToList();
}
public DataModel() {}
}