2015-10-16 76 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