2016-10-13 2 views
0

Wir haben eine lustige Situation, wo wir JSON als Zeichenfolge in SQL Server speichern. Uns ist es egal, was in diesem Objekt ist, es ist eine ziemlich durchgängige Eigenschaft. Passthrough bedeutet, dass wir es nur für Kunden speichern und es so zurückgeben, wie es ist. Wir haben es nie in C# gelesen. Ich speichere es als Nvarchar in der Datenbank, aber ich versuche herauszufinden, wie ich diese Zeichenfolge automatisch in ein JSON-Objekt serialisieren kann, um zum Client zurückzukehren. Ich möchte nicht in Javascript rufen fromJson haben.WEB.API Rückgabe Zeichenfolge Eigenschaft wie JSON

Wir verwenden Newtonsoft als unseren Json Serializer. Hier ist die High-Level-Setup:

DTO:

public class MyDto{ 
    public dynamic SessionBag { get;set;} 
} 

Entity Framework Entity:

public class My{ 
    public string SessionBag { get;set;} 
} 

Ein Kunde würde Post/put uns:

{"SessionBag":{"Name":"test"}} 

Wir würden dann speichern in der db als String:

"{"Name":"test"}" 

Wie kann ich das so serialisiert werden, wenn es von Web.API gibt es wie folgt aussieht:

{ 
    SessionBag:{ 
     Name: "test" 
    } 

} 

Ich bin derzeit Herumspielen zu erhalten versuchen, es mit dynamischen/Objekt zu speichern. Aber ich kann mir nicht vorstellen, wie ich es als JSON-Objekt zurückgeben kann. Ich würde gerne herausfinden, wie man das mit nur Anmerkungen macht.

Hier ist, wie ich es in einen String umwandeln zu speichern:

if (dto.SessionBag != null){ 
    var serializer = JsonSerializer.Create(new JsonSerializerSettings(){ 
       NullValueHandling = NullValueHandling.Ignore 

    }); 
    using (var writer = new StringWriter()){ 
      serializer.Serialize(writer, dto.SessionBag); 
      entity.SessionData = writer.ToString(); 
    } 
} 

Bei seiner hilfreich unsere WebApiControllers ziemlich einfach sind und kehren nur eine IHttpActionResult mit dem dto. Alle Rückmeldungen sind willkommen.

Antwort

0

Also ich denke, ich habe es herausgefunden. In meinem dto:

[JsonIgnore] 
public string SessionBagString { get; set; } 

public JObject SessionBag 
{ 
     get 
     { 
      if (!string.IsNullOrEmpty(SessionBagString)) 
      { 
       return JObject.Parse(SessionBagString); 
      } 
      return null; 
     } 
     set 
     { 
      if(value != null) 
      { 
       SessionBagString = value.ToString(); 
      } 
     } 
} 

In meinem Repo-Code habe ich jetzt:

if (dto.SessionBag != null) 
{   
    entity.SessionBagString = dto.SessionBagString; 
} 

Das ist ziemlich viel für mich gearbeitet. Lass mich wissen, ob es einen besseren Weg gibt, es zu tun.

Verwandte Themen