我懒于将表数据加载到JSON结果中,然后将它们拖到前端应用程序中。但是当我获得这些数据时,我注意到该响应中存在不必要的元素,即空元素。因此,我的PUT
或更新操作不适用于这些内部JSON属性。
{
"image":null,
"paragraph":null,
"question":{
"grid":null,
"elements":[
],
"offeredAnswers":[
],
"lazyLoader":{
},
"id":"1",
"text":"How can we serve you better?",
"type":"textarea",
"questionRequired":false,
"pageFlowModifier":false,
"gridId":null,
"min":null,
"max":null
},
"lazyLoader":{
}
}
如果更改
text
的值,则不会更新,但是如果更改paragraph
,则它将在数据库中更改。这里有一个名为
lazyLoader
的新属性,我也需要摆脱它。和elements
,offeredAnswers
实际上是不需要的,因为它们为空。我通过在引用的类中添加virtual
关键字来实现延迟加载。public partial class Questions
{
public Questions()
{
Elements = new HashSet<Elements>();
OfferedAnswers = new HashSet<OfferedAnswers>();
}
public string Id { get; set; }
public string Text { get; set; }
public string Type { get; set; }
public bool QuestionRequired { get; set; }
public bool PageFlowModifier { get; set; }
public int? GridId { get; set; }
public long? Min { get; set; }
public long? Max { get; set; }
public virtual Grids Grid { get; set; }
public virtual ICollection<Elements> Elements { get; set; }
public virtual ICollection<OfferedAnswers> OfferedAnswers { get; set; }
}
我在
Startup.cs
文件中有此行来停止引用循环处理,因为如果没有该操作,则由于我发布的POST
对象非常复杂,并且其中包含引用循环,因此JSON
操作不起作用。services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddJsonOptions(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
并且我启用了延迟加载代理。
services.AddDbContext<RDS_Context>
(options => options.UseLazyLoadingProxies().UseSqlServer(connection));
最佳答案
您可以通过迭代Object
的Array
从json中删除空的JProperty
和JObject
,例如
class Program
{
static void Main(string[] args)
{
string json = File.ReadAllText(@"C:\Users\xxx\source\repos\ConsoleApp4\ConsoleApp4\Files\json6.json");
JObject data = JObject.Parse(json);
//Getting all those children that have value are empty from outer json
var result1 = data.Children<JProperty>()
.Where(x => (x.Value.Type == JTokenType.Object) && !x.Value.HasValues)
.ToList();
//Getting all those children that have value are empty from "question" object
var result2 = data["question"].Children<JProperty>()
.Where(x => (x.Value.Type == JTokenType.Object && !x.Value.HasValues) || (x.Value.Type == JTokenType.Array && !x.Value.HasValues))
.ToList();
//Remove all above empty object or arrays
result1.ForEach(x => x.Remove());
result2.ForEach(x => x.Remove());
var obj = data.ToObject<JObject>();
Console.WriteLine(obj);
Console.ReadLine();
}
}
输出:
注意:如果要在整个json中仅删除空的
lazyLoader
对象,请在上面的代码中使用以下几行。//Getting "lazyLoader" children that have value are empty from outer json
var result1 = data.Children<JProperty>()
.Where(x => x.Value.Type == JTokenType.Object && !x.Value.HasValues && x.Name == "lazyLoader")
.ToList();
//Getting "lazyLoader" children that have value are empty from "question" object
var result2 = data["question"].Children<JProperty>()
.Where(x => (x.Value.Type == JTokenType.Object && !x.Value.HasValues && x.Name == "lazyLoader"))
.ToList();
输出: