我几天来一直在努力解决这个问题,并希望有人可以帮助我。我有一个余烬前端,它与用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();
}
}
如果任何人有任何阅读资源或示例可以提供帮助,我们将不胜感激。
谢谢,
答案 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
}
}