![](/img/trans.png)
[英]JSON deserialization - Map array indices to properties with JSON.NET
[英]Json.net deserialization, child properties that come as an array when empty
我正在與一個可以返回以下JSON結構的Web服務進行通信:
{
"foo": {
"bar": "hello world"
}
}
Foo是可選的,但是我們得到以下內容,而不是值NULL。
{
"foo": []
}
一個空數組。 我通過在我的模型中使用以下屬性來使用(丑陋的)工作:
public dynamic Foo { get; set; }
public FooModel FooObject {
get
{
if(Foo == null || Foo.GetType().IsArray)
{
return null;
}
return ((JObject)Foo).ToObject<FooModel>();
}
}
這適用於這個單一屬性。 但是webservice為所有NULL對象執行此操作。 我正在尋找一種通用的解決方案,在反序列化時忽略所有空數組。 (或者是其他東西)
我一直無法找到解決方案。 我嘗試使用自定義JsonConverter和ContractResolver。
避免問題的一個簡單方法是將JSON預先加載到JToken
然后使用擴展方法RemoveEmptyArrayProperties
從Woo commerce json到Dataset或datatable的 答案中刪除所有空數組屬性:
public static class JsonExtensions
{
public static TJToken RemoveEmptyArrayProperties<TJToken>(this TJToken root) where TJToken : JToken
{
var container = root as JContainer;
if (container == null)
return root;
var query = container.DescendantsAndSelf()
.OfType<JProperty>()
.Where(p => p.Value is JArray && ((JArray)p.Value).Count == 0);
foreach (var property in query.ToList())
{
property.Remove();
}
return root;
}
}
給定該方法,您可以按如下方式預處理JSON字符串:
var root = JObject.Parse(jsonString)
.RemoveEmptyArrayProperties()
.ToObject<RootObject>();
樣本工作.Net小提琴在這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.