相关疑难解决方法(0)

JSON.NET在忽略null属性的同时序列化JObject

我有一个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.P2Foo.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 …

c# json json.net nsjsonserialization

13
推荐指数
1
解决办法
7680
查看次数

如何使用Json.NET以与对象相同的方式序列化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": …

c# json.net

8
推荐指数
3
解决办法
3847
查看次数

序列化为JSON时排除集合中的特定项

我试图"挑选"我要序列化的特定类型的集合中的哪些对象.

示例设置:

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中覆盖哪个方法.我该怎么做?

.net c# json json.net

6
推荐指数
1
解决办法
2072
查看次数

Json.NET 获取嵌套的 jToken 值

我正在使用 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)

json.net

6
推荐指数
1
解决办法
9144
查看次数

Newtonsoft JSON在合并和/或序列化时删除null属性

请考虑以下情形:

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,但这些是我正在使用的动态对象,所以模型是未知的.

c# json json.net

5
推荐指数
0
解决办法
924
查看次数

json.net 中的字符串行为:为什么将空 JToken 替换为非空值?

这使用 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)

c# null json.net

3
推荐指数
1
解决办法
2482
查看次数

标签 统计

json.net ×6

c# ×5

json ×3

.net ×1

nsjsonserialization ×1

null ×1