我有一个JObject用作调用RESTful Web服务的模板.这JObject是通过解析器创建的,因为它被用作模板告诉用户端点模式是什么样的,我不得不想办法保留所有属性,这就是为什么我将它们的值默认为null.例如,这就是对象最初的样子:
{
"Foo":{
"P1":null,
"P2":null,
"P3":null,
"P4":{
"P1":null,
"P2":null,
"P3":null,
},
"FooArray":[
{
"F1":null,
"F2":null,
"F3":null,
}
]
},
"Bar":null
}
Run Code Online (Sandbox Code Playgroud)
然后,用户能够填补他们需要单独的领域,如Foo.P2和Foo.P4.P1:
{
"Foo":{
"P1":null,
"P2":"hello world",
"P3":null,
"P4":{
"P1":1,
"P2":null,
"P3":null,
},
"FooArray":[
{
"F1":null,
"F2":null,
"F3":null,
}
]
},
"Bar":null
}
Run Code Online (Sandbox Code Playgroud)
意思是他们只关心这两个领域.现在我想将此模板(JObject)序列化为JSON字符串,但只想要填充的那些字段显示出来.所以我尝试了这个:
string json = JsonConvert.SerializeObject(template,
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用.我遇到了这个问题,并意识到null对象中的值是一个实际JToken类型,而不是真正的类型null,这是有道理的.但是,在这种非常特殊的情况下,我需要能够摆脱这些"未使用"的字段.我尝试手动迭代节点并删除它们,但这也不起作用.请注意,我使用的唯一托管类型是JObject …
如何控制JObject到字符串的序列化?
我有一些返回JObject的API,我通常会应用一些更改并保留或返回它们.我想避免持久化null属性并应用一些额外的格式,但JsonConvert似乎完全忽略我的设置.
以下是问题的示例:
// startup.cs has the following
services.AddMvc().AddJsonOptions(o =>
{
o.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});
public class SampleController : Controller
{
JsonSerializerSettings _settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
};
[HttpPost]
[Route("object")]
public object PostObject([FromBody] SomeObject data)
{
return JsonConvert.SerializeObject(data, _settings);
}
[HttpPost]
[Route("jobject")]
public object PostJObject([FromBody] JObject data)
{
return JsonConvert.SerializeObject(data, _settings);
}
public class SomeObject
{
public string Foo { get; set; }
public string Bar { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
发布{ "Foo": "Foo", "Bar": …
我试图"挑选"我要序列化的特定类型的集合中的哪些对象.
示例设置:
public class Person
{
public string Name { get; set; }
public List<Course> Courses { get; set; }
}
public class Course
{
...
public bool ShouldSerialize { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我需要能够排除Person.Courses集合中ShouldSerialize为false的所有课程.这需要在ContractResolver中完成 - ShouldSerialize属性就是一个例子,在我的实际场景中可能还有其他标准.我不想创建一个ShouldSerializeCourse(如这里指定的那样:http://james.newtonking.com/json/help/index.html?topic = html/ConditionsProperties.htm )
我似乎无法找出在ContractResolver中覆盖哪个方法.我该怎么做?
我正在使用 Json.NET 解析 json http 响应并有工作代码,但我很确定我正在以一种过于复杂的方式进行处理。我的问题是是否有更直接的方法来通过路径获取子 jToken 和/或反序列化它而不用 foreaching 每个级别。
我试过这种方法,但它返回空值:
JObject jObj = JObject.Parse( text );
JToken myVal;
jObj.TryGetValue( "response.docs", out myVal );
Run Code Online (Sandbox Code Playgroud)
这是我的工作过于复杂的代码,包括反序列化:
JObject jObj = JObject.Parse( text );
foreach( var kv in jObj ) {
if( kv.Key == "response" ) {
foreach( JToken jt in kv.Value ) {
if( jt.Path == "response.docs" ) {
JEnumerable<JToken> children = jt.Children();
foreach( JToken t in children ) {
//THIS WORKS BUT IS NOT ELEGANT
Solr_User[] su = t.ToObject<Solr_User[]>();
}
} …Run Code Online (Sandbox Code Playgroud) 请考虑以下情形:
var s1 = "{\"hello\":\"world\", \"test\":\"somevalue\"}";
var s2 = "{\"hello\":\"world\", \"test\":null}";
var j1 = JObject.Parse(s1);
var j2 = JObject.Parse(s2);
j1.Merge(j2, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union, MergeNullValueHandling = MergeNullValueHandling.Merge });
var jf = JsonConvert.SerializeObject(j1, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
Run Code Online (Sandbox Code Playgroud)
结果jf是{"hello":"world", "test":null}
我如何调用库以获得合并的结果:
{"hello":"world"}
这是一个我必须递归遍历结果对象并手动删除空值属性的情况吗?或者是否有一些魔术棒说"在序列化时只丢弃这些空值"
我知道JsonProperty -> NullValueHandling,但这些是我正在使用的动态对象,所以模型是未知的.
这使用 json.net (C#)。不知道为什么 JToken 不为空。
var obj = new JObject();
obj["field1"] = null;
var token = obj["field1"];
Console.WriteLine(token == null); // false
Console.WriteLine(token.ToString() == ""); // true
Console.WriteLine(token.Type == JTokenType.Null); // true
Run Code Online (Sandbox Code Playgroud)