2014-11-15 68 views
0

我需要顯示Json文件列表。每個文件都包含一個相當大的對象,需要一段時間才能序列化。總的來說,當我只想顯示它們的列表時,序列化每個對象的性能會花費太多時間。該文件看起來有點像這樣:如何在Json.NET中儘可能快地檢索大文件中的幾個值?

{ 
    'Name': 'File Name', 
    'Version': '1.6', 
    'BigLongToSerializeObject': {/* The big object here */} 
} 

如何從這個文件中Json.NET僅檢索NameVersion儘可能高效地?

+0

將'[JsonIgnore]'屬性應用於保存這些字段的模型,並且不會反序列化它。 –

+0

我最終必須反序列化它,就在它顯示一個不應該列表的列表時。 –

+0

你見過[this](https://blog.mariusschulz.com/2013/04/15/conditionally-serializing-fields-and-properties-with-jsonnet)嗎? –

回答

0

您可以通過自定義ContractResolver自定義您的反序列化。

創建合同解析器

class ListContractResolver : DefaultContractResolver 
{ 
    protected override IList<JsonProperty> CreateProperties(
         Type type, 
         MemberSerialization memberSerialization) 
    { 
     var result = base.CreateProperties(type, memberSerialization); 
     if(/*type is your type*/) 
      result = result.Where(i=>i.PropertyName != "BigLongToSerializeObject") 
          .ToList(); 
     return result; 
    } 
} 

那麼對於名單解串

var listSerializer = new JsonSerializer(); 
serializer.ContractResolver = new ListContractResolver(); 

那麼你可以使用listSerializer反序列化列表,並使用默認的序列正常反序列化創建序列化。

+0

想要添加一個方法'ShouldSerialize'作爲@ Jeroen-Vannevel說創建一個新類不容易嗎? –

0

JSON# has a very lightweight tool可以讓你實現這一點。它會從更大的JSON對象中檢索嵌入式JSON:

const string schoolMetadata = @"{ "school": {..."; 
var jsonParser = new JsonObjectParser(); 

using (var stream = 
    new MemoryStream(Encoding.UTF8.GetBytes(schoolMetadata))) { 
    Json.Parse(_jsonParser, stream, "teachers"); 
} 

在這裏,我們從一個較大的「學校」對象中檢索「老師」的對象。

相關問題