Newtonsoft JSON - 如何反序列化JSON
问题描述:
我需要帮助了解如何使用的JsonConverter.ReadJson方法将值转换任意数量的类型(字符串,布尔,日期,整型时,使用JsonConverter.ReadJson方法来进行类型转换,数组,对象)到特定的自定义类型。Newtonsoft JSON - 如何反序列化JSON
例如,我有以下;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
//where reader.Value could be a string, boolean, Date, int, array, object
//and in this example the value of reader.Value is a string
return new MyCustomType(reader.Value);
}
但是这给出了错误;
Compilation error (line 115, col 36): Argument 1: cannot convert from 'object' to 'string'
我用C#有一点绿色,只需要帮助做这项工作。
答
终于搞定了;
public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
MyCustomType myCustomType = new MyCustomType();//for null values
if (reader.TokenType != JsonToken.Null)
{
if (reader.TokenType == JsonToken.StartArray)
{
JToken token = JToken.Load(reader);
List<string> items = token.ToObject<List<string>>();
myCustomType = new MyCustomType(items);
}
else
{
JValue jValue = new JValue(reader.Value);
switch (reader.TokenType)
{
case JsonToken.String:
myCustomType = new MyCustomType((string)jValue);
break;
case JsonToken.Date:
myCustomType = new MyCustomType((DateTime)jValue);
break;
case JsonToken.Boolean:
myCustomType = new MyCustomType((bool)jValue);
break;
case JsonToken.Integer:
int i = (int)jValue;
myCustomType = new MyCustomType(i);
break;
default:
Console.WriteLine("Default case");
Console.WriteLine(reader.TokenType.ToString());
break;
}
}
}
return myCustomType;
}
不知道这是否是最好的解决方案,但它的工作。
答
自对象的基础,只是想和你的字符串,你为什么不这样称呼它:
return new MyCustomType(reader.Value.ToString());
答
您可以测试值类型之前转换。 你可以这样做:
if (reader.TokenType != JsonToken.String)
{
throw new JsonSerializationException();
}
var value = serializer.Deserialize<string>(reader);
感谢MoustafaS 只处理一种类型(串),我需要能够处理所有类型:字符串,布尔日期,INT,数组,对象 – ClaraU
你提到,你要转换为字符串,怎么会你处理数组?所有其他对象实现.ToString()@claracruz – MoustafaS
一个字符串只是一个例子,但这是我的问题我如何处理所有数据类型 – ClaraU