0

I am using Newtonsoft.Json for years but now I am facing something I can not solve.

I have a class that contains this property:

public SortedDictionary<ePosizioniColonna, ColonnaExcel> Colonne { get; set; } = new SortedDictionary<ePosizioniColonna, ColonnaExcel>() {
     { ePosizioniColonna.FESTIVITA, new ColonnaExcel() { Intestazione = "Festività", Larghezza = 9 } },
     { ePosizioniColonna.UTENTE, new ColonnaExcel() { Intestazione = "Utente" } },
     { ePosizioniColonna.DESCRIZIONE_ORA, new ColonnaExcel() { Intestazione = "Desc. Ora", Larghezza = 90 } },
     { ePosizioniColonna.DATA, new ColonnaExcel() { Intestazione = "Data", Larghezza = 12} },
     { ePosizioniColonna.UNITA_MISURA, new ColonnaExcel() { Intestazione = "Um", Larghezza = 6 } },
     { ePosizioniColonna.ORE_STANDARD, new ColonnaExcel() { Intestazione = "Ore\nStandard" } },
     { ePosizioniColonna.ORE_EXTRA_STANDARD, new ColonnaExcel() { Intestazione = "Ore\nExtra" } },
     { ePosizioniColonna.ORE_STANDARD_VIAGGIO, new ColonnaExcel() { Intestazione = "Ore\nStandard\nViaggio" } },
     { ePosizioniColonna.ORE_EXTRA_STANDARD_VIAGGIO, new ColonnaExcel() { Intestazione = "Ore\nExtra\nViaggio" } },
     { ePosizioniColonna.GRUPPO_1, new ColonnaExcel() { Intestazione = "" } },
     { ePosizioniColonna.GRUPPO_2, new ColonnaExcel() { Intestazione = "" } },
     { ePosizioniColonna.ORE_LAVORATE, new ColonnaExcel() { Intestazione = "Ore\nLavorate", Larghezza = 8 } },
     { ePosizioniColonna.ORE_VIAGGIO, new ColonnaExcel() { Intestazione = "Ore\nViaggio" } },
     { ePosizioniColonna.ORE_ORDINARIO, new ColonnaExcel() { Intestazione = "Ore\nOrdinario" } },
     { ePosizioniColonna.ORE_STRAORDINARIO, new ColonnaExcel() { Intestazione = "Ore\nStraordinario" } },
     { ePosizioniColonna.ORE_NOTTURNO, new ColonnaExcel() { Intestazione = "Ore\nNotturno" } },
     { ePosizioniColonna.ORE_NOTTURNO_FESTIVO, new ColonnaExcel() { Intestazione = "Ore\nNotturno\nFestivo" } },
     { ePosizioniColonna.ORE_STRAORD_NOTTURNO, new ColonnaExcel() { Intestazione = "Ore\nStraord.\nNotturno" } },
     { ePosizioniColonna.ORE_STRAORD_FESTIVO, new ColonnaExcel() { Intestazione = "Ore\nStraord.\nFestivo" } },
     { ePosizioniColonna.ORE_STRAORD_FESTIVO_NOTTURNO, new ColonnaExcel() { Intestazione = "Ore\nStraord.\nFestivo\nNotturno" } },
     { ePosizioniColonna.CODICE_COMMESSA, new ColonnaExcel() { Intestazione = "Codice\nCommessa" } },
     { ePosizioniColonna.AZIENDA, new ColonnaExcel() { Intestazione = "Azienda" } }
};

Where ePosizioniColonna is an enum.

I have no problem serializing it, but I get the exception "cannot convert string into object" when I try to deserialize.

It works if I change the SortedDictionary into:

public SortedDictionary<int, ColonnaExcel> Colonne { get; set; } = new SortedDictionary<int, ColonnaExcel>() {
     { (int)ePosizioniColonna.FESTIVITA, new ColonnaExcel() { Intestazione = "Festività", Larghezza = 9 } },
     { (int)ePosizioniColonna.UTENTE, new ColonnaExcel() { Intestazione = "Utente" } },
     { (int)ePosizioniColonna.DESCRIZIONE_ORA, new ColonnaExcel() { Intestazione = "Desc. Ora", Larghezza = 90 } },
     { (int)ePosizioniColonna.DATA, new ColonnaExcel() { Intestazione = "Data", Larghezza = 12} },
     { (int)ePosizioniColonna.UNITA_MISURA, new ColonnaExcel() { Intestazione = "Um", Larghezza = 6 } },
     { (int)ePosizioniColonna.ORE_STANDARD, new ColonnaExcel() { Intestazione = "Ore\nStandard" } },
     { (int)ePosizioniColonna.ORE_EXTRA_STANDARD, new ColonnaExcel() { Intestazione = "Ore\nExtra" } },
     { (int)ePosizioniColonna.ORE_STANDARD_VIAGGIO, new ColonnaExcel() { Intestazione = "Ore\nStandard\nViaggio" } },
     { (int)ePosizioniColonna.ORE_EXTRA_STANDARD_VIAGGIO, new ColonnaExcel() { Intestazione = "Ore\nExtra\nViaggio" } },
     { (int)ePosizioniColonna.GRUPPO_1, new ColonnaExcel() { Intestazione = "" } },
     { (int)ePosizioniColonna.GRUPPO_2, new ColonnaExcel() { Intestazione = "" } },
     { (int)ePosizioniColonna.ORE_LAVORATE, new ColonnaExcel() { Intestazione = "Ore\nLavorate", Larghezza = 8 } },
     { (int)ePosizioniColonna.ORE_VIAGGIO, new ColonnaExcel() { Intestazione = "Ore\nViaggio" } },
     { (int)ePosizioniColonna.ORE_ORDINARIO, new ColonnaExcel() { Intestazione = "Ore\nOrdinario" } },
     { (int)ePosizioniColonna.ORE_STRAORDINARIO, new ColonnaExcel() { Intestazione = "Ore\nStraordinario" } },
     { (int)ePosizioniColonna.ORE_NOTTURNO, new ColonnaExcel() { Intestazione = "Ore\nNotturno" } },
     { (int)ePosizioniColonna.ORE_NOTTURNO_FESTIVO, new ColonnaExcel() { Intestazione = "Ore\nNotturno\nFestivo" } },
     { (int)ePosizioniColonna.ORE_STRAORD_NOTTURNO, new ColonnaExcel() { Intestazione = "Ore\nStraord.\nNotturno" } },
     { (int)ePosizioniColonna.ORE_STRAORD_FESTIVO, new ColonnaExcel() { Intestazione = "Ore\nStraord.\nFestivo" } },
     { (int)ePosizioniColonna.ORE_STRAORD_FESTIVO_NOTTURNO, new ColonnaExcel() { Intestazione = "Ore\nStraord.\nFestivo\nNotturno" } },
     { (int)ePosizioniColonna.CODICE_COMMESSA, new ColonnaExcel() { Intestazione = "Codice\nCommessa" } },
     { (int)ePosizioniColonna.AZIENDA, new ColonnaExcel() { Intestazione = "Azienda" } }
};

So it seems that is related to the enum.

Can anyone suggest to me a possible solution to keep using the enum instead of int?

Peter Csala
  • 17,736
  • 16
  • 35
  • 75
  • Probably a duplicate of [this](https://stackoverflow.com/questions/25201242/json-net-serializing-enums-to-strings-in-dictionaries-by-default-how-to-make-i). – ProgrammingLlama Mar 23 '22 at 06:51
  • How does your serialized json look like? Do you use any Converter, ContractResolver or anything else which can alter the json output? – Peter Csala Mar 23 '22 at 09:16
  • 1
    Can't reproduce, see https://dotnetfiddle.net/3Gu4TV. Please [edit] your question to share a [mcve]. See: [ask]. If you cannot for some reason, please [edit] your question to share the full `ToString()` output of the exception including exception type, message, traceback and inner exception(s) if any. – dbc Mar 23 '22 at 12:48

0 Answers0