我懒于将表数据加载到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();
输出:
改造正在返回一个空的响应主体 - java我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…
ASP.NET Web API 2中AuthorizeAttribute发生了什么变化? - c#我已经将项目和一组单元测试从ASP.NET Web API升级到ASP.NET Web API 2。我们将自定义DelegatingHandler用于自定义身份验证机制。它将Thread.CurrentPrincipal和HttpContext.Current.User设置为适当的System.Security.Claims.ClaimsPrincipal。…
Google Analytics API - php我正在实施Google Analytics(分析)Api。授权完成没有问题。成功授权后,我得到403 return code并得到消息:User does not have sufficient permissions for this profile。我的帐户具有Google Analytics(分析)数据,可以跟踪多个网站,并且我可以从网络浏览器访问它而…
从代码和网站调用Web API - c#首先,我使用C#4.0作为编码语言。我相信我看到了一些答案,其中4.5引入了一些可以使此操作变得容易得多的方法,但这不是我要求更改框架。我正在创建一个MVC4 WebApi,它将同时被网站和C#代码使用(在另一个项目中)。通常,当从JavaScript调用时,我会这样做:$.ajax({ dataType: 'text', url: …
我需要帮助将此REST API Curl命令转换为Python请求 - python我在这里是新手,老实说对所有编码都是新手。我正在尝试创建一个Pyton脚本,以使用REST API从Request Tracker资产数据库中搜索项目。到目前为止,我得到了以下Curl命令:curl -X POST \ -H "Content-Type: application/json" \ -d '[{ "fiel…