C# jest (zazwyczaj) statycznie typowany. JSON dynamicznie. Dlatego deserializacja z JSONa do C# - potrzebna, gdy np. kod C# ma korzystać z zewnetrznego API - może stwarzać problemy.
Przykład. WooCommerce ma wystawione API, za pomocą którego można m.in. pobrać / wysłać dane produktu/ów. Obiekt określający produkt zawiera m.in. tablicę meta-danych, które są zdefiniowane w sposób następujący:
Attribute Type Description idinteger Meta ID. READ-ONLY keystring Meta key. valuestring Meta value.
Model danych, do którego to deserializować, wydaje się być prosty?
public class Product
{
/* ...
... inne pola
... */
public List<ProductMeta> meta_data {get; set;}
}
public class ProductMeta
{
public ulong id {get; set;}
public string key {get; set;}
public string value {get; set;}
}
Gdzie tam. value zazwyczaj jest stringiem, ale nie zawsze. Niektóre wtyczki mają w nosie dokumentację i w polu value wysyłają obiekt JSONowy, a nie stringa. Dlatego public string value grozi wyjątkami podczas deserializacji.
Gdyby to miał być obiekt JSONowy taki albo inny, to można by jeszcze zastosować dziedziczenie... Ale string albo obiekt?!
Jedyny pomysł, jaki mi przychodzi do głowy, to albo public object value {get; set;}, albo public dynamic value {get; set;}.
Rzeczywiście trzeba w tego rodzaju sytuacjach użyć dynamic, czy jest jakieś lepsze rozwiązanie, którego nie widzę?