2015-06-23 6 views
0

У меня есть веб-API, встроенный в .NET 4.0, и у меня есть проблема с простым запросом GET. Моя проблема в том, что я хочу вернуть объект, у которого много свойств, некоторые строки, ints и другие пользовательские типы данных, а в некоторых случаях некоторые из этих свойств не существуют в databsae, поэтому я хочу, чтобы он возвращал объект empy {} и У меня только null.Как вернуть пустой объект вместо null в web api

Вот некоторые из моего кода

<ActionName("index")> 
    <HttpGet> 
    Public Function ObtenerAsegurado(<FromUri> rut As Integer) As Asegurado 

     Dim ws As New Getter2.GetterSoapClient 
     Dim aseg As Getter2.AseguradoDTO    

     aseg = ws.ObtenerAsegurado(rut) 

     Dim objAsegurado As Asegurado = Convertir.DTOToAsegurado(aseg) 

     Return objAsegurado  

    End Function 

    Public Shared Function DTOToAsegurado(asegDTO As Getter2.AseguradoDTO) As Asegurado 
     Dim aseg As New Asegurado 

     If Not asegDTO Is Nothing Then 
      ... 
      aseg.cuenta = DTOToCuentas(asegDTO.Cuenta) 
      ... 
     End If 
     Return aseg 
    End Function 

    Private Shared Function DTOToCuentas(cuentaDTO As Getter2.CuentaDTO) As Cuenta 
     Dim nuevacuenta As New Cuenta 

     If Not cuentaDTO Is Nothing AndAlso Not cuentaDTO.DescBanco Is Nothing Then 
      ... 
     Else 
      nuevacuenta = Nothing 
     End If 
     Return nuevacuenta 
    End Function 

Как вы можете видеть, мое действие вызов другой функции, чтобы сделать некоторые Перекодировка, и я вернуть свойство объекта, как ничто, когда там нет , который становится нулевым в ответе http, и вместо этого я хочу пустой объект. {} Я также попытался вернуть nuevacuenta = New Cuenta, но возвратил объект со всеми его свойствами, установленными в ничто ... Пожалуйста, помогите, как я могу вернуть пустой, а не null?

+0

Когда я делаю это я получаю ошибку произнесения, потому что 'Object' тип не может быть преобразован в обычай' Cuenta' типа –

+0

То, что вы хотите немного нестандартное. {} будет равно для экземпляра без свойства (или экземпляра типа объекта). Поэтому, если вы действительно этого хотите, я думаю, вы должны объявить тип свойства в модели вида как «объект». – hazjack

ответ

0

Я не уверен, если это проблема, но я думаю, что это может быть способ, которым вы ничего не проверяете?

<ActionName("index")> 
<HttpGet> 

Public Function ObtenerAsegurado(<FromUri> rut As Integer) As Asegurado 
    ' 
    Dim ws As New Getter2.GetterSoapClient 
    Dim aseg As Getter2.AseguradoDTO    
    ' 
    aseg = ws.ObtenerAsegurado(rut) 
    Dim objAsegurado As Asegurado = Convertir.DTOToAsegurado(aseg) 
    Return objAsegurado 
    '  
End Function 
' 
Public Shared Function DTOToAsegurado(asegDTO As Getter2.AseguradoDTO) As Asegurado 
    ' 
    Dim aseg As New Asegurado 
    If (asegDTO Is Nothing) = False Then 
    '... 
    aseg.cuenta = DTOToCuentas(asegDTO.Cuenta) 
    '... 
    End If 
    Return aseg 
    ' 
End Function 
' 
Private Shared Function DTOToCuentas(cuentaDTO As Getter2.CuentaDTO) As Cuenta 
    ' 
    Dim nuevacuenta As New Cuenta 
    If (cuentaDTO Is Nothing) = False And (cuentaDTO.DescBanco Is Nothing) = False Then 
    '... 
    Else 
    nuevacuenta = Nothing 
    End If 
    Return nuevacuenta 
    ' 
End Function 
1

Я обнаружил, что можно преобразовать нулевой экземпляр в пустой объект {} в JSON. C# код есть https://gist.github.com/juanonsoftware/7067ce53813201abbdae

 var settings = new JsonSerializerSettings() 
     { 
      ContractResolver = new NullToEmptyObjectResolver(typeof(Child)) 
     }; 
     var str = JsonConvert.SerializeObject(m, settings); 



class NullToEmptyObjectResolver : DefaultContractResolver 
{ 
    private readonly Type[] _types; 

    public NullToEmptyObjectResolver(params Type[] types) 
    { 
     _types = types; 
    } 

    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
     return type.GetProperties().Select(p => 
     { 
      var jp = base.CreateProperty(p, memberSerialization); 
      jp.ValueProvider = new NullToEmptyValueProvider(p, _types); 
      return jp; 
     }).ToList(); 
    } 
} 

class NullToEmptyValueProvider : IValueProvider 
{ 
    readonly PropertyInfo _memberInfo; 
    private readonly Type[] _types; 

    public NullToEmptyValueProvider(PropertyInfo memberInfo, params Type[] types) 
    { 
     _memberInfo = memberInfo; 
     _types = types; 
    } 

    public object GetValue(object target) 
    { 
     var result = _memberInfo.GetValue(target); 

     if (_types.Contains(_memberInfo.PropertyType) && result == null) 
     { 
      result = new object(); 
     } 

     return result; 
    } 

    public void SetValue(object target, object value) 
    { 
     _memberInfo.SetValue(target, value); 
    } 
} 
Смежные вопросы