从Ember-Data格式化WebAPI 2的Json

时间:2018-02-28 13:00:13

标签: json generics asp.net-web-api ember-data

我几天来一直在努力解决这个问题,并希望有人可以帮助我。我有一个余烬前端,它与用C#编写的API进行通信。

我正在做一个更新(PUT)请求,但模型的所有属性都是null。原因是因为API需要

{ 
  "Type":1,
  "Name":"Hello World"
}

但是ember以

的格式发送它
{
  "Object":
  { 
   "Type":1,
   "Name":"Hello World"
  }
}

我已经看到了可以在API模型中添加自定义JsonConverter的解决方案,但这必须为每个模型提供自己的转换器。我想知道是否有人帮助我使用可以应用于任何型号的通用型。

以下是一个特定于个人资料模型的示例,我似乎无法将其作为通用工具使用。

    [JsonConverter(typeof(ProfileConverter))]
    public class Profile
    {
        public string LoginId { get; set; }
        public bool NewProfileOptIn { get; set; }
    }

和转换器

public class ProfileConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(Profile).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        Log.Information("Reading Json from ProfileSetting");
        JToken token = JToken.Load(reader);
        if (token["ProfileSetting"] != null)
        {
            JObject inner = token["ProfileSetting"].Value<JObject>();
            if (CheckJsonProperty(inner, "login_id") && CheckJsonProperty(inner, "new_profile_opt_in"))
            {
                Profile model = new Profile
                {
                    LoginId = inner["login_id"].ToString(),
                    NewProfileOptIn = (bool)inner["new_profile_opt_in"]
                };
                return model;
            }
            return null;
        }
        Log.Error("Invalid Model Name Passed - Expected 'ProfileSetting'");
        return null;
    }

    private bool CheckJsonProperty(JObject objectToCheck, string expectedJsonProperty)
    {
        if (objectToCheck[expectedJsonProperty] != null)
        {
            return true;
        }
        Log.Error("Invalid or Missing Model Property Name Passed - Expected '" + expectedJsonProperty + "'");
        return false;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

如果任何人有任何阅读资源或示例可以提供帮助,我们将不胜感激。

谢谢,

1 个答案:

答案 0 :(得分:0)

<强> VB.Net

此示例已使用Json.Net进行编码。

所以我和Vb.net合作,但这应该以同样的方式在C#中工作。 我没有JsonConverter就能做到如下:

Public Class TestController
    Inherits ApiController

    <HttpGet> 
    Public Function Index() As String

        Dim o As New JObject
        o.Add("Data", 10)
        Dim j As New JObject
        j.Add("Object", o)

        Dim obj = j.ToObject(Of EmberDataObject(Of TestObject))()

        Return "200 - OK"
    End Function
End Class

Public Class EmberDataObject(Of T)
    <JsonProperty("Object")>
    Public Property DataObject As T
End Class

Public Class TestObject
    Public Property Data As Integer
End Class

在上面的示例中,带有此标记的JsonObject

{
  "Object": {
    "Data": 10
  }
}

可以轻松转换。然后,您可以将嵌套类型作为obj.DataObject进行访问。通过设置JsonProperty属性,您可以省略至少在Vb中不是合法属性名称的Object关键字。

<强> C#

C#翻译将是这样的:

public class EmberDataObject<T>
{
    [JsonProperty("Object")
    public T DataObject {get; set;}
}

public class TestData
{
    public int Data {get; set;}
}

然后从您的Controller中引用它,如下所示:

public class MyApiController : ApiController
{
    public IActionResult Post(EmberDataObject<TestData> emberObject)
    {
        /// Inner Object Available as emberObject.Object
    }
}