如何在web api中返回空对象而不是null

时间:2015-06-23 21:32:15

标签: asp.net vb.net asp.net-web-api

我有一个用.NET 4.0构建的Web API,我遇到了一个简单的GET请求问题。我的问题是我想返回一个具有许多属性,一些字符串,整数和其他自定义数据类型的对象,在某些情况下,databsae中不存在某些属性,所以我希望它返回一个empy对象{{ 1}}我只是拥有{}

以下是我的一些代码

null

正如你所看到的,我的动作调用另一个函数进行一些转换,并且当我不存在时,我将对象的属性返回为无,在http响应中变为null并且我想要一个空对象而是 <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 我也试过返回{},但返回一个对象,其所有属性设置为空...请帮助我如何返回空而不是null?

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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