Search code examples
c#jsonyamlyamldotnet

YamlDotNet Convert YAML to JSON in C#


I need help when trying to convert a yaml to json it is passing all the properties to string, and it does not recognize the bool or integer fields.

I am using the YamlDotNet library, in c #. If anyone can help me I would appreciate it

// convertir string to stream
byte[] ArchivoConvertidobyteArray = Encoding.ASCII.GetBytes(archivoRuta);

var vigenciaYaml = (new StreamReader(new MemoryStream(ArchivoConvertidobyteArray)));
vigenciaJson = ConvertirYamlAJson(vigenciaYaml);

public static string ConvertirYamlAJson(TextReader yml)
{
    var deserializer = new DeserializerBuilder().Build(); 
    var yamlObject = deserializer.Deserialize(yml); 
    var serializer = new SerializerBuilder().JsonCompatible().Build(); 
    string json = serializer.Serialize(yamlObject); 
    return json;
}

Yaml file

# Definición del contrato
CodigoTipoContrato: BAS2
Descripcion: BASICO DOS
Empresa: DECORÉ
# Definición de conceptos del contrato
TiposConcepto:
- CodigoTipoConcepto: VPAG
  Descripcion: VALOR A PAGAR
  NaturalezaContable: debito
  PerfilContabilizacion: PCGRAL
  GrupoImpuestosArticulo: ''
  CodigoMoneda: COP
  PermiteCruce: true

What is expected

{
  "CodigoTipoContrato": "BAS2",
  "Descripcion": "BASICO DOS",
  "Empresa": "DECORÉ",
  "TiposConcepto": [
    {
      "CodigoTipoConcepto": "VPAG",
      "Descripcion": "VALOR A PAGAR",
      "NaturalezaContable": "debito",
      "PerfilContabilizacion": "PCGRAL",
      "GrupoImpuestosArticulo": "",
      "CodigoMoneda": "COP",
      "PermiteCruce": true
    }
  ]
}

This is how it is turning

{
  "CodigoTipoContrato": "BAS2",
  "Descripcion": "BASICO DOS",
  "Empresa": "DECORÉ",
  "TiposConcepto": [
    {
      "CodigoTipoConcepto": "VPAG",
      "Descripcion": "VALOR A PAGAR",
      "NaturalezaContable": "debito",
      "PerfilContabilizacion": "PCGRAL",
      "GrupoImpuestosArticulo": "",
      "CodigoMoneda": "COP",
      "PermiteCruce": "true"
    }
  ]
}

Solution

  • without entity or class, you have to force the type of value in yaml:

    # Definición del contrato
    CodigoTipoContrato: BAS2
    Descripcion: BASICO DOS
    Empresa: DECORÉ
    # Definición de conceptos del contrato
    TiposConcepto:
    - CodigoTipoConcepto: VPAG
      Descripcion: VALOR A PAGAR
      NaturalezaContable: debito
      PerfilContabilizacion: PCGRAL
      GrupoImpuestosArticulo: ''
      CodigoMoneda: COP
      PermiteCruce: !!bool true
    

    json result:

    {
        "CodigoTipoContrato": "BAS2",
        "Descripcion": "BASICO DOS",
        "Empresa": "DECOR?",
        "TiposConcepto": [
            {
                "CodigoTipoConcepto": "VPAG",
                "Descripcion": "VALOR A PAGAR",
                "NaturalezaContable": "debito",
                "PerfilContabilizacion": "PCGRAL",
                "GrupoImpuestosArticulo": "",
                "CodigoMoneda": "COP",
                "PermiteCruce": true
            }
        ]
    }
    

    you have the same trick with int: !!int