我正在尝试使用Newton Json Deserializer反序列化json对象,如下所示:
{
"grades": 97
}
Or this:
{
"grades": ""
}
我想知道如何在C#中正确定义DTO类来表示这个对象?谢谢!
答案 0 :(得分:5)
请尝试使用dynamic
关键字:
public class Rootobject
{
public dynamic grades { get; set; }
}
它适用于string
和int
。有关详细信息,请参阅using dynamic type。
<强>更新强>
然后转换为int
或string
我将使用Convert.ToString()
因为它处理null
值而int
我会使用Int32.TryParse()
因为如果输入int
格式不正确,我可以更好地控制转化为drades
。
<强>更新强>
如果成绩为&#34;&#34;,C#中的任何可空类型都将成为null
。为此,您可以使用int?
。但如果等级类似于&#34; 3ds&#34;然后你必须使用一些动态的方法。
答案 1 :(得分:2)
我宁愿在您的POCO上使用自定义JsonConverter,这将确保将对象反序列化为一个预期类型,而不是使用object
或dynamic
,然后必须处理该属性怀疑整个代码库。
这是我将如何做到的:
public class IntConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value.GetType() == typeof(int))
writer.WriteValue((int)value);
else
writer.WriteValue(value.ToString());
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) =>
ParseInt(reader.Value.ToString());
public override bool CanConvert(Type objectType) =>
objectType == typeof(int) || objectType == typeof(string);
private static int ParseInt(string value)
{
int parsedInt = 0;
int.TryParse(value, out parsedInt);
return parsedInt;
}
}
然后在你的POCO中使用这个JsonConverter:
public class Student
{
[JsonProperty("grades"),
JsonConverter(typeof(IntConverter))]
public int Grades;
}
我会发现这是最好的做法&#39;对于这些事情。