3 Stimmen

Wie kann man den Typ in JSON.NET beim Serialisieren fälschen?

Sagen wir, ich habe

public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string PhoneNumber { get; set; }
    }

Wenn ich nun einen anonymen Typ wie...

var p = new Person() {FirstName = "bob",
                      LastName = "builder",
                      PhoneNumber = "0800 YESWECAN"};

var anon = new {p.FirstName, p.LastName};

mit JSON.NET, wenn Sie TypeNameHandling = TypeNameHandling.Objects haben, wird es serialisieren (und dann für Deserilisation verwenden) den Typ. Was ich tun möchte, ist, den Typ in der ärgerlichen Klasse zu fälschen, so dass, wenn es serialisiert wird es wie ein "Person" Objekt aussieht.

Gibt es eine gute und einfache Möglichkeit, dies zu tun?

HINWEIS: Es MUSS die Json.Net-Typ-Informationen in der json ( $type ) haben. So LBs Antwort nicht das Problem lösen, in der Tat könnte ich nur die .net Frameworks json Einrichtungen verwenden, um genau das zu tun.

2voto

L.B Punkte 110059

Sie können serialisieren als

string str = JsonConvert.SerializeObject(new { FirstName = "aaa", LastName = "bbb" })

und Sie erhalten eine Zeichenkette, die wie ein Person-Objekt aussieht

{"FirstName":"aaa","LastName":"bbb"}

Da Json keine Typinformationen enthält, können Sie es zu Person zurück deserialisieren

var person = JsonConvert.DeserializeObject(str, typeof(Person));

2voto

Keith Nicholas Punkte 42417

Um es zu fälschen, kann ich einen Vertrag einführen, um einen Eigenschaftsnamen bei der Ausgabe des Json zu ändern... z.B...

 public class FakeTypeContractResolver : DefaultContractResolver
    {        
        protected override string ResolvePropertyName(string propertyName)
        {
            return propertyName == "_type_" ? "$type" : propertyName;
        }
    }

Wenn Sie also die json.net Deserializer-Einstellungen auf

TypeNameHandling = TypeNameHandling.Objects
TypeNameAssemblyFormat = FormatterAssemblyStyle.Full

können Sie einen ärgerlichen Typ wie den folgenden erstellen,

var x = new 
{
     _type_ = typeof(Person).AssemblyQualifiedName,
     p.FirstName, 
     p.LastName
}

die in den Typinformationen vorgibt, eine "Person" zu sein, d.h. wenn Sie sie deserialisieren, erhalten Sie ein Personenobjekt.

HINWEIS: Die Einstellungen für den Serializer zu json müssen so eingestellt werden, dass die Typinformationen nicht serialisiert werden, wenn Sie sie vortäuschen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X