Q:

¿Como validar los datos de un json al deserealizar?

Tengo una funcion que recibe un string ,el string es un json,
En la cual necesito validar los datos del json que me envian a la funcion ,este es mi json ,hay un array llamado productos ojo.
   {"comprobante_tipo":1,"comprobante_emision":"10-05-2017","comprobante_moneda":2,"documento_tipo":6,"documento_numero":"20536161199","direccion":"Av.La Tienda de Charlie","nombre":"Cesar Vallejo","productos":[{"nombre":"Caramelos2","codigo":741,"cantidad":12,"unidad":"2","precio_unidad":2000},{"nombre":"Chocolates2","codigo":231,"cantidad":12,"unidad":"UNIDADES","precio_unidad":20002}]}

Queria primero desearelizar el json,y ponerlo en un dynamic ,luego validarlo,y si estaba todo "bien",lo serealizo y lo envio a una webservice.
Pero al intentar el codigo de abajo me sale que debo aplicar un puntero.
   if (x->comprobante_moneda.GetType() == typeof(int)) { } else { throw new Exception("Ingreso no Valido en Moneda"); }

Pasa con este ,y con el siguiente
if (x.comprobante_tipo.GetType() == typeof(int)) { } else { throw new Exception("Ingreso no Valido en Tipo de Comprobante "); }
        if (x.comprobante_emision.GetType() == typeof(string)) { } else { throw new Exception("Ingreso no Valido en Emision"); }
        if (x.documento_tipo.GetType() == typeof(int)) { } else { throw new Exception("Ingreso no Valido en Tipo de Documento"); }
        if (x.documento_numero.GetType() == typeof(string)) { } else { throw new Exception("Ingreso no Valido en Numero de Documento"); }
        if (x.direccion.GetType() == typeof(string)) { } else { throw new Exception("Ingreso no Valido en Direccion"); }
        if (x.nombre.GetType() == typeof(string)) { } else { throw new Exception("Ingreso no Valido en Nombre"); }
        if (x.productos.codigo.GetType() == typeof(string)) { } else { throw new Exception("Ingreso no Valido en Productos"); }
        if (x.productos.cantidad.GetType() == typeof(int)) { } else { throw new Exception("Ingreso no Valido en Cantidad"); }
        if (x.productos.unidad.GetType() == typeof(int)) { } else { throw new Exception("Ingreso no Valido en Unidad"); }
        if (x.productos.precio_unidad.GetType() == typeof(int)) { } else { throw new Exception("Ingreso no Valido en Precio de unidad"); }

Que podria hacer ? o que otra cosa deberia intentar? 
Gracias

A:

Lo ideal es que serialices a una clase, aunque depende mucho de lo que te refieras con validar, es decir, que los enteros sean mayor a cero, cadenas de texto sin caracteres especiales etc. Con esto, estarías accediendo y evaluando de forma directa las propiedades de la clase.
Definición de clases:
public class Datos
{
    public int comprobante_tipo { get; set; }
    public string comprobante_emision { get; set; }
    public int comprobante_moneda { get; set; }
    public int documento_tipo { get; set; }
    public string documento_numero { get; set; }
    public string direccion { get; set; }
    public string nombre { get; set; }
    public List<Productos> productos { get; set; }
}

public class Productos
{
    public string nombre { get; set; }
    public int codigo { get; set; }
    public int cantidad { get; set; }
    public string unidad { get; set; }
    public decimal precio_unidad { get; set; }
}

Recibir el json y serializarlo al tipo Datos:
Datos datos = new Datos();
datos = Newtonsoft.Json.JsonConvert.DeserializeObject<Datos>(json);

Ahora, podras realizar todas las validaciones necesarias sobre el objeto datos. Por ejemplo:
if(datos.comprobante_tipo == 0)
{
    throw new Exception("Ingreso no Valido en Tipo de Comprobante ");
}

Para realizar validaciones en la lista, se tiene que recorrer usando foreach:
foreach(Productos item in datos.productos) { 
    if(string.IsNullOrEmpty(item.nombre)) {
        throw new Exception("Ingreso no Valido en Nombre"); }
    }
}

