从Ember-Data格式化Web API 2的Json

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Ember-Data格式化Web API 2的Json相关的知识,希望对你有一定的参考价值。

我几天来一直在努力解决这个问题,并希望有人可以帮助我。我有一个ember前端,它与用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();
    }
}

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

谢谢,

答案

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
    }
}

以上是关于从Ember-Data格式化Web API 2的Json的主要内容,如果未能解决你的问题,请参考以下文章

EmberJS / Ember-data:尽管存在所有ID,但hasMany集合不完整

通知 ember-data 有关服务器更改

如何使用 Ember.js 和 ember-data 创建新记录?

Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

管理从 web api 以 json 格式返回的属性名称

从flutter web发送api时,如果body中输入了复杂的格式