2016-10-13 2 views
0

У нас есть забавная ситуация, когда мы храним json в виде строки в SQL Server. Нас не волнует, что в этом объекте является его довольно передовым свойством. Passthrough означает, что мы просто сохраняем его для клиентов и возвращаем его как есть. Мы никогда не читаем его на C#. Я храню его как nvarchar в базе данных, но я пытаюсь понять, как я могу автоматически сериализовать эту строку в json-объект, чтобы вернуться к клиенту. Я не хочу иметь в javascript звоните fromJson.WEB.API возвращает свойство строки как json

Мы используем Newtonsoft в качестве нашего Json Serializer. Вот HighLevel установка:

DTO:

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

Entity Framework Entity:

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

клиент будет отправлять/поставить нас:

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

Мы бы сохранить его в db в виде строки:

"{"Name":"test"}" 

Как сериализовать это так, когда он возвращается из Web.API это выглядит следующим образом:

{ 
    SessionBag:{ 
     Name: "test" 
    } 

} 

В настоящее время я Мессинг вокруг, пытаясь заставить его сохранить, используя динамический/объект. Но я не могу понять, как вернуть его как объект json. Мне бы хотелось разобраться, как это сделать с помощью аннотаций.

Вот как преобразовать его в строку, чтобы сохранить:

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(); 
    } 
} 

В случае его полезные наши WebApiControllers довольно просты и просто возвращают IHttpActionResult с DTO. Вся обратная связь приветствуется.

ответ

0

Так что я думаю, что понял. В моем 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(); 
      } 
     } 
} 

В моем коде репо у меня сейчас:

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

Это довольно много работал для меня. Дайте мне знать, если есть лучший способ сделать это.