因为我们的项目中需要对某一部分数据进行局部更新,所以第一时间考虑到了 HttpPatch请求~
这时候问题就来了,因为我们项目中对JSON数据的解析使用的是.net自带的System.Text.Json类库。但是恰好接收Patch请求参数的 JsonPatchDocument 。它竟然不支持。。。
解析还是需要引入Newtonsoft.Json。
我目前项目框架中使用了System.Text.Json 进行了格式化设置,当我在Program中配置AddNewtonsoftJson()后就会如官方文档所说
意思就是我之前的格式化就不好使了。。。
接着不急,官方给出了解决方案
嗯。。。。先这样,再那样。
我看着示例放了进去,不好使(因为官方示例只是展示了这个模块的用法,项目中肯定会有其他的设置,不知道是项目当中哪个地方的设置起了冲突,有大牛成功的话可以指导一下~)
划重点~~~
还是一如既往,我自己搞个实现吧。用的是Post请求
先放一个Helper吧~
public static class MapHelper
{
///
/// 部分更新,只替换需要更新的部分
///
/// 新数据
/// 旧数据载体
/// 前端传输的动态json数据(缩小匹配范围)
/// 新数据
/// 旧数据载体(新数据将进行局部更新)
///
public static TTarget Replace(string json,TSource source, TTarget target)
{
var sourcePros = source.GetType().GetProperties();
var targetPros = target.GetType().GetProperties();
//拿到需要更新数据的属性
var change = (from s in sourcePros.AsEnumerable()
join t in targetPros.AsEnumerable()
on s.Name equals t.Name
where s.GetValue(source) != t.GetValue(target) && json.Contains($""{s.Name}"")
select s).ToList();
foreach (var s in change)
{
var tP= targetPros.FirstOrDefault(f=>f.Name==s.Name);
if(tP != null)
{
tP.SetValue(target,s.GetValue(source));
}
}
return target;
}
}
再贴一个用法
前端传进参数,进行反序列化,查出旧数据,json变量是为了缩小匹配更新的范围,传什么更新什么。
这里用到了反射~~
有问题私信我,如有更好的方法,请大家多多指正~~



