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 id
integer Meta ID. READ-ONLY key
string Meta key. value
string 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ę?