2012-03-05 28 views
11

"type" adlı bir alan içeren bir json veri akışı verdim. Bu tür alan, çalışma zamanında oluşturulması gereken nesnenin türünü tanımlar. JsonTextReader'ı iki kez kullanamıyorum ve metin okuyucuyu en baştan sıfırlamak için bulamıyorum gibi görünüyor.JsonTextReader iki kez nasıl kullanılır?

using (var streamReader = new StreamReader(stream, Encoding)) 
using (var jsonTextReader = new JsonTextReader(streamReader)) 
{ 
    JToken token = JObject.Load(jsonTextReader); 
    var type = (string) token.SelectToken("type"); 
    var modelType = Type.GetType("Project." + type + ", Project"); 

    // Fails here 
    var obj = serializer.Deserialize(jsonTextReader, modelType); 
} 

Bu hata iletisini alıyorum. Seri hale getirme nesnesinde beklenmeyen bir belirteç: EndObject.

cevap

10

JToken'dan bir JsonReader oluşturabilirsiniz.

JsonReader reader = token.CreateReader(); 
+0

Bu hile yaptı! Teşekkürler. – Phil

0

Daha fazla test yaptım ve aşağıdaki çalışmaların bulunduğunu tespit ettim. Set JsonTextReader.CloseInput = false

  • JsonTextReader
  • StreamReader.BaseStream.Position = 0
  • Set (using deyimi kapatarak) Destroy

    1. böyle yeni JsonTextReader

    O olmazdı şey oluşturun:

    using (var streamReader = new StreamReader(stream, encoding)) 
    { 
        Type modelType = null; 
    
        using (var jsonTextReader = new JsonTextReader(streamReader)) 
        { 
         jsonTextReader.CloseInput = false; 
    
         JToken token = JObject.Load(jsonTextReader); 
         string type = (string)token.SelectToken("type"); 
         modelType = Type.GetType("Project." + type + ", Project"); 
        } 
    
        streamReader.BaseStream.Position = 0; 
    
        using (var jsonTextReader = new JsonTextReader(streamReader)) 
        { 
         var obj = serializer.Deserialize(jsonTextReader, modelType); 
        } 
    
    } 
    
  • +0

    Bu çalışmaz. StreamReader öğesinin yapıcısında 'leaveOpen' parametresini belirtmedikçe, temel akışı kapatır. Eğer bunu çözdüyseniz, bu sorudaki kod işe yaradıysa işe yarayabilir, ancak işe yaramıyor. – svick

    +0

    Orijinal yayın test edildi, ancak yanlış. Onu güncelledim. – tstuts

    1

    , begginning için okuyucu reset 0.

    streamReader.BaseStream.Position = 0; 
    

    Düzenleme için altta yatan akışının pozisyonu özelliğini ayarlamak için: Bu altta yatan akışı sıfırlar iken , jsonTextReader salt ileri tanım olarak satır numarası ve konumu salt okunur anlamına gelir. Bunun çalışması için streamReader konumunu sıfırlamanız ve ardından yeni JsonTextReader nesnesine beslemeniz gerekir.

    Maalesef Phil, JsonTextReader'ı ileriye dönük olmasından bu yana iki kez okumanın bir yolu yok.

    Referans: "tefrika Json verilerine hızlı, önbelleğe alınmamış, salt ileri erişim sağlayan bir okuyucu temsil" http://james.newtonking.com/projects/json/help/html/T_Newtonsoft_Json_JsonTextReader.htm

    +0

    Bunun doğru şekilde çalıştığından emin misiniz? "StreamReader" ve "JsonTextReader" öğelerinin ikisi de muhtemelen bunu yaparak sıfırlanmayacak iç durumu korur. – svick

    0

    James Newton King'in tavsiye ettiği gibi vs. Büyük nesne Öbek, in my blog, kaçınarak, bir bellek verimli biçimde JsonTextReader kullanarak kapsamaktadır. Bunu ve sağlanan kodu, JsonTextReader'un temel uygulaması hakkında endişelenmeden, birden çok kez JSON'unuzu okumak için kullanabilirsiniz.

    Yorumlar ve görüşler her zaman memnuniyetle karşılanır.