使用可能是字符串或int的字段反序列化JSON对象的最佳做法是什么?

时间:2017-02-17 20:58:11

标签: c# .net json serialization deserialization

我正在尝试使用Newton Json Deserializer反序列化json对象,如下所示:

{
  "grades": 97
}

Or this:

{
  "grades": ""
}

我想知道如何在C#中正确定义DTO类来表示这个对象?谢谢!

2 个答案:

答案 0 :(得分:5)

请尝试使用dynamic关键字:

public class Rootobject
{
     public dynamic grades { get; set; }
}

它适用于stringint。有关详细信息,请参阅using dynamic type

<强>更新

然后转换为intstring我将使用Convert.ToString()因为它处理null值而int我会使用Int32.TryParse()因为如果输入int格式不正确,我可以更好地控制转化为drades

<强>更新

如果成绩为&#34;&#34;,C#中的任何可空类型都将成为null。为此,您可以使用int?。但如果等级类似于&#34; 3ds&#34;然后你必须使用一些动态的方法。

答案 1 :(得分:2)

我宁愿在您的POCO上使用自定义JsonConverter,这将确保将对象反序列化为一个预期类型,而不是使用objectdynamic,然后必须处理该属性怀疑整个代码库。

这是我将如何做到的:

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;对于这些事情。

相关问题