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

d8tt03nd  于 2023-01-22  发布在  .NET
关注(0)|答案(2)|浏览(83)

我尝试将JSON绑定到控制器中的一个自定义类,它来自一个我无法控制的源。我遇到的问题是,值数组以[{'value':'value 1'},[{'value':'value 2'}].我知道我可以创建一个只有一个字段'value'的对象,绑定也可以工作,但我想避免这种情况,并从绑定到字符串列表的请求中获取所有值。
我有一个控制器方法

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

下面是我希望数据模型的外观。

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

这是数据的例子

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

有没有办法做到这一点,最好是使用attriubte?

dsf9zpds

dsf9zpds1#

让绑定对象保持原样,从你无法控制的源Map过来,只需要为对象定制一个getter,把它转换成你想要的列表。使用自动Map器或其他推荐的第三方库会增加不必要的复杂性。

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

46qrfjad2#

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

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() {}
}

相关问题