public T GetFirstInstance<T>(string propertyName, string json)
{
using (var stringReader = new StringReader(json))
using (var jsonReader = new JsonTextReader(stringReader))
{
while (jsonReader.Read())
{
if (jsonReader.TokenType == JsonToken.PropertyName
&& (string)jsonReader.Value == propertyName)
{
jsonReader.Read();
var serializer = new JsonSerializer();
return serializer.Deserialize<T>(jsonReader);
}
}
return default(T);
}
}
public class MyType
{
public string Text { get; set; }
}
public void Test()
{
string json = "{ \"PropOne\": { \"Text\": \"Data\" }, \"PropTwo\": \"Data2\" }";
MyType myType = GetFirstInstance<MyType>("PropOne", json);
Debug.WriteLine(myType.Text); // "Data"
}
Takie podejście pozwala uniknąć deserializacji całego obiektu. Należy jednak pamiętać, że poprawi to wydajność tylko wtedy, gdy json jest duży, a właściwość deserializacji jest relatywnie wcześnie w danych. W przeciwnym razie powinieneś po prostu odserializować całość i wyciągnąć części, które chcesz, np. Odpowiedzi na pytania dotyczące jcwwtów.
Zaktualizowany nieznacznie dla lepszej przydatności do ponownego użycia. –
Ta metoda jest zepsuta tym, że przechwyci pierwszą właściwość "PropOne" w dowolnym miejscu na dowolnym poziomie, a nie tylko w katalogu głównym drzewa. Można to naprawić, śledząc poziom i akceptując tylko poprawną nazwę właściwości na poziomie katalogu głównego. – hultqvist
Pamiętaj, że może to być przydatne, jeśli nie masz pewności, jaki ciąg znaków JSON dekodujesz, i musisz przeczytać właściwość, aby to zrozumieć. – starbeamrainbowlabs