Ho un'applicazione C# MVC che memorizza i dati come stringhe JSON in un documento XML e anche in tabelle DB MySQL.Newtonsoft.JSON non può convertire il modello con l'attributo TypeConverter
Recentemente ho ricevuto l'obbligo di memorizzare stringhe JSON in campi di database MySQL, per essere convertito in C# oggetti tramite Newtonsoft.Json, così ho deciso di implementare un TypeConverter per convertire le stringhe JSON in personalizzati C# Models.
purtroppo non posso utilizzare il seguente comando in qualsiasi parte mia soluzione per deserializzare le mie corde JSON quando l'attributo TypeConverter viene aggiunto al mio C# Modello:
JsonConvert.DeserializeObject<Foo>(json);
Rimozione l'attributo risolvere il problema tuttavia questo mi impedisce dalla conversione dei campi DB MySQL in oggetti C# personalizzati.
Ecco il mio C# modello con l'attributo TypeConverter aggiunto:
using System.ComponentModel;
[TypeConverter(typeof(FooConverter))]
public class Foo
{
public bool a { get; set; }
public bool b { get; set; }
public bool c { get; set; }
public Foo(){}
}
Ecco il mio TypeConverter Classe:
using Newtonsoft.Json;
using System;
using System.ComponentModel;
public class FooConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
}
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
string s = value.ToString().Replace("\\","");
Foo f = JsonConvert.DeserializeObject<Foo>(s);
return f;
}
return base.ConvertFrom(context, culture, value);
}
}
}
Non appena aggiungo l'attributo al Foo Classe I riceve il seguente errore:
Impossibile deserializzare l'oggetto JSON corrente (ad es. {"name": "value"}) nel tipo "Models.Foo" perché il tipo richiede un valore di stringa JSON per deserializzare correttamente.
Per correggere l'errore sia modificare il JSON per un valore di stringa JSON o modificare il tipo deserializzare in modo che sia un tipo normale NET (ad esempio non un tipo di base come numero intero, non un tipo di insieme come un array o Elenco) che può essere deserializzato da un oggetto JSON. JSONObjectAttribute può anche essere aggiunto al tipo per forzarlo a deserializzare da un oggetto JSON.
Sto usando la seguente stringa (che funziona perfettamente senza aggiungere l'attributo TypeConverter):
"{\"Foo\":{\"a\":true,\"b\":false,\"c\":false}}"
Non
sicuro di quello che sta succedendo qui, tutte le idee?
Molte grazie !!!
UPDATE
ho hanno scoperto che anche io ho problemi con azioni su MVC API Controller che accettano classe di test con Foo come una proprietà o sui controller che accettano Foo come oggetto quando l'attributo TypeConverterviene aggiunto alla classe Foo.
Ecco un esempio di un controller di test che ha problemi:
public class TestController : ApiController
{
[AcceptVerbs("POST", "GET")]
public void PostTestClass(TestClass t)
{
// Returns null when TypeConverter attribute is added to the Foo Class
return t.Foo;
}
AcceptVerbs("POST", "GET")]
public void PostFooObj(Foo f)
{
// Returns null when TypeConverter attribute is added to the Foo Class
return f;
}
}
La TypeConverter potrebbe causare problemi imperative modello WebAPI rilegatura e restituisce null quando entrambe le azioni sopra riceve JSON tramite AJAX con la seguente struttura:
// eg. PostTestClass(TestClass T)
{'Foo': {'a': false,'b': true,'c': false}};
// eg. PostFooObj(Foo f)
{'a': false,'b': true,'c': false}
quando l'attributo TypeConverter viene aggiunto alla classe Foo, il seguente metodo della classe FooConverter TypeConverter è chiamato non appena il percorso si trova:
public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
}
return base.CanConvertFrom(context, sourceType);
}
Il metodo ConvertFrom sul TypeController FooConverter NON viene chiamato dall'azione di ApiController, che potrebbe essere la causa del problema.
Ancora una situazione simile, in cui le azioni del controller funzioneranno correttamente senza l'attributo TypeConverter.
Qualsiasi ulteriore aiuto molto apprezzato !!
Molte grazie.
è la stringa JSON corretta su ciò che è stato mostrato "" {\ "Foo \": ...} "'? – kaveman
Sì, sei corretto, il JSON non cambia nella mia soluzione di test. Tutto quello che sto cambiando è l'aggiunta/rimozione dell'attributo TypeConverter. Grazie – Steve
Sono curioso di sapere se puoi usare una struttura JSON più simile a "" {\ "a \": true, \ "b \": false, \ "c \": false} "" ad es. senza il wrapping '" {\ "Foo \": ...} "' oggetto. Questo JSON può essere deserializzato direttamente usando 'JsonConvert.DeserializeObject (json)' –
kaveman