2015-10-16 43 views
2

值我有一个这样的类:手柄“(空)”在Newtonsoft.JSON

public class MyClass 
{ 
    public DateTimeOffset DateCreated { get; set; } 
    public string Name { get; set; } 
    public User User {get;set;} 
} 

我打电话一种服务,有时会表现为空值“(空)”,像这样:

{"name":"(null)", "dateCreated":"(null)", "user":"(null)"} 

处理这个问题的最佳方法是什么?我试过插入自定义合同解析器,但我不想为所有事情做到这一点。有没有办法我可以重写标记化,以便这可以被视为空?或者其他一些可以利用的可用性点?

+2

_“什么是最好的方式来处理这个问题?”_获取服务输出一个适当的'null'响应:)如果没有,我敢肯定有一种方法可以真正应付它... –

+1

听起来像一个蹩脚的服务器; P –

+0

对不起,家伙,服务器不在我的控制之下。 – tallseth

回答

2

做最简单的事情可能是你的JSON装载到一个JObject然后与实际空令牌替换"(null)"字符串标记:

 var obj = JObject.Parse(jsonString); 
     foreach (var value in obj.Descendants().OfType<JValue>().Where(v => v.Type == JTokenType.String && (string)v == "(null)").ToList()) 
      value.Replace(JValue.CreateNull()); 

     var myClass = obj.ToObject<MyClass>(); 

请注意,你将需要你的DateTimeOffset属性更改为一个可空要做到这一点:

public class MyClass 
{ 
    public DateTimeOffset? DateCreated { get; set; } 
    public string Name { get; set; } 
    public User User { get; set; } 
} 

或者,你可以可以完全删除伪空值属性:

 var obj = JObject.Parse(jsonString); 
     foreach (var value in obj.Descendants().OfType<JValue>().Where(v => v.Type == JTokenType.String && (string)v == "(null)").ToList()) 
     { 
      if (value.Parent.Type == JTokenType.Property) 
       value.Parent.Remove(); // Psuedo null-valued object property. Remove the property. 
      else 
       value.Replace(JValue.CreateNull()); // Psuedo null-valued array entry. Replace with null to avoid reindexing the array. 
     } 

     var myClass = obj.ToObject<MyClass>(); 
+0

完美。这是我尝试过的解决方案,但是由于我不熟悉'JObject'以便正确工作,所以陷入了困境。谢谢。 – tallseth