我几天来一直在努力解决这个问题,并希望有人可以帮助我。我有一个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
}
}