2015-08-28 68 views
-1

動態JSON我試圖擴展這裏給出 試圖遵循 http://james.newtonking.com/projects/json/help/CustomCreationConverter.html JSON.net例如反序列化對象JSON.net例子。反序列化使用JSON.Net解串器

階層結構:

public class Rootobject 
{ 
public int took { get; set; } 
public bool timed_out { get; set; } 
public _Shards _shards { get; set; } 
public Hits hits { get; set; } 
} 

public class _Shards 
{ 
public int total { get; set; } 
public int successful { get; set; } 
public int failed { get; set; } 
} 

public class Hits 
{ 
public int total { get; set; } 
public float max_score { get; set; } 
public Hit[] hits { get; set; } 
} 

public class Hit 
{ 
public string _index { get; set; } 
public string _type { get; set; } 
public string _id { get; set; } 
public float _score { get; set; } 
public Inner_Hits inner_hits { get; set; } 
} 

public class Inner_Hits 
{ 
public Testp11 testp11 { get; set; } 
public Testp10 testp10 { get; set; } 
} 

public class Testp11 
{ 
public Hits1 hits { get; set; } 
} 

public class Hits1 
{ 
public int total { get; set; } 
public float max_score { get; set; } 
public Hit1[] hits { get; set; } 
} 

public class Hit1 
{ 
public string _index { get; set; } 
public string _type { get; set; } 
public string _id { get; set; } 
public _Nested _nested { get; set; } 
public float _score { get; set; } 
public _Source _source { get; set; } 
} 

public class _Nested 
{ 
public string field { get; set; } 
public int offset { get; set; } 
public _Nested1 _nested { get; set; } 
} 

public class _Nested1 
{ 
public string field { get; set; } 
public int offset { get; set; } 
public _Nested2 _nested { get; set; } 
} 

public class _Nested2 
{ 
public string field { get; set; } 
public int offset { get; set; } 
} 

public class _Source 
{ 
public string pname { get; set; } 
public Value[] values { get; set; } 
} 

public class Value 
{ 
public string pid { get; set; } 
public string[] val { get; set; } 
} 

public class Testp10 
{ 
public Hits2 hits { get; set; } 
} 

public class Hits2 
{ 
public int total { get; set; } 
public float max_score { get; set; } 
public Hit2[] hits { get; set; } 
} 

public class Hit2 
{ 
public string _index { get; set; } 
public string _type { get; set; } 
public string _id { get; set; } 
public _Nested3 _nested { get; set; } 
public float _score { get; set; } 
public _Source1 _source { get; set; } 
} 

public class _Nested3 
{ 
public string field { get; set; } 
public int offset { get; set; } 
public _Nested4 _nested { get; set; } 
} 

public class _Nested4 
{ 
public string field { get; set; } 
public int offset { get; set; } 
public _Nested5 _nested { get; set; } 
} 

public class _Nested5 
{ 
public string field { get; set; } 
public int offset { get; set; } 
} 

public class _Source1 
{ 
public string pname { get; set; } 
public Value1[] values { get; set; } 
} 

public class Value1 
{ 
public string pid { get; set; } 
public string[] val { get; set; } 
} 

在對JSON文檔我的調用函數:

string json = "{ \"took\": 2, \"timed_out\": false, \"_shards\": { \"total\": 5, \"successful\": 5, \"failed\": 0 }, \"hits\": { \"total\": 4, \"max_score\": 8.225408, \"hits\": [  { \"_index\": \"dev28\", \"_type\": \"Index_Type1\", \"_id\": \"user_2\", \"_score\": 8.225408, \"inner_hits\": { \"testp11\": { \"hits\": {    \"total\": 1, \"max_score\": 5.816241, \"hits\": [ { \"_index\": \"dev28\",     \"_type\": \"Index_Type1\",     \"_id\": \"user_2\",     \"_nested\": { \"field\": \"doc\",\"offset\": 0, \"_nested\": { \"field\": \"roles\", \"offset\": 0, \"_nested\": { \"field\": \"permissions\", \"offset\": 0 } } }, \"_score\": 5.816241, \"_source\": { \"pname\": \"Permission1\", \"values\": [ { \"pid\": \"S1_P1\", \"val\": [ \"V12\", \"V11\" ] } ] } } ] } },\"testp10\": { \"hits\": { \"total\": 1, \"max_score\": 5.816241, \"hits\": [ { \"_index\": \"dev28\", \"_type\": \"Index_Type1\",\"_id\": \"user_2\", \"_nested\": { \"field\": \"doc\", \"offset\": 0, \"_nested\": {\"field\": \"roles\", \"offset\": 0, \"_nested\": { \"field\": \"permissions\", \"offset\": 0}} }, \"_score\": 5.816241, \"_source\": {\"pname\": \"Permission2\",\"values\": [ {\"pid\": \"S1_P1\", \"val\": [\"V12\",\"V11\" ]} ] } } ] } } } }]} }";    

      dynamic objResultElasticData = (Rootobject)Newtonsoft.Json.JsonConvert.DeserializeObject(json, typeof(Rootobject)); 

在上面的類我有類爲「公共類Inner_Hits」,其中,數據可以是一個動態與不同的名字。目前它有「Testp11」&「Testp10」,也可以是「Testp12」與「Testp11」具有相同的層次結構,有人可以給我一個指針,我該如何實現這種動態行爲。

希望有人能指出我正確的方向。

問候, 傑克

回答

1

您可以利用Json.NET的能力serialize a dictionary到JSON名稱/值對的對象來定義inner_hits如下:

public Dictionary<string, InnerHit> inner_hits { get; set; } 

你也應該結合所創造的各種複製類的自動代碼生成器。一個完整的實現將是:

public class Shards 
{ 
    public int total { get; set; } 
    public int successful { get; set; } 
    public int failed { get; set; } 
} 

public class Nested 
{ 
    public string field { get; set; } 
    public int offset { get; set; } 
    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] // Do not write the null value 
    public Nested _nested { get; set; } 
} 

public class Value 
{ 
    public string pid { get; set; } 
    public List<string> val { get; set; } 
} 

public class Source 
{ 
    public string pname { get; set; } 
    public List<Value> values { get; set; } 
} 

public class Hit2 
{ 
    public string _index { get; set; } 
    public string _type { get; set; } 
    public string _id { get; set; } 
    public Nested _nested { get; set; } 
    public double _score { get; set; } 
    public Source _source { get; set; } 
} 

public class Hits2 
{ 
    public int total { get; set; } 
    public double max_score { get; set; } 
    public List<Hit2> hits { get; set; } 
} 

public class InnerHits 
{ 
    public Hits2 hits { get; set; } 
} 

public class Hit 
{ 
    public string _index { get; set; } 
    public string _type { get; set; } 
    public string _id { get; set; } 
    public double _score { get; set; } 
    public Dictionary<string, InnerHits> inner_hits { get; set; } 
} 

public class Hits 
{ 
    public int total { get; set; } 
    public double max_score { get; set; } 
    public List<Hit> hits { get; set; } 
} 

public class RootObject 
{ 
    public int took { get; set; } 
    public bool timed_out { get; set; } 
    public Shards _shards { get; set; } 
    public Hits hits { get; set; } 
} 

而且,沒有必要在這裏使用dynamic,你可以做:

 var root = JsonConvert.DeserializeObject<RootObject>(json); 

,並獲得靜態檢查的優勢正確性。

+0

非常感謝您爲我節省了一天的「dbc」.... – Jack

1

如果你的類屬性是動態變化的話,我想你不能使用此解析器。 看看這個。這可能會幫助你。 DynamicJSon Parser

+0

嗨苛刻,驗證的Java腳本解析器鏈接你提供的,但如果你檢查上面提供的「dbc」提供的看起來更乾淨的答案。感謝您的回覆。 – Jack