我有一个这样的对象:
public class Foo
{
int bar;
[JsonExtensionData] public Dictionary<string, object> Catchall;
}
和这样的 JSON: jsonString = { "bar": "not an int", "dink": 1 }
所以如果我var foo = JsonConvert.DeserializeObject<Foo>(jsonString)
bar
将无法反序列化到类Foo
中,因为它的类型错误,但是是否可以将其插入到[JsonExtensionData] Catchall
字典中?
您可以使用 [JsonIgnore]
标记属性bar
,然后在相应的序列化回调中手动添加和删除其在Catchall
字典中的值:
public class Foo
{
const string barName = "bar";
[JsonIgnore]
public int? Bar { get; set; }
[JsonExtensionData]
public Dictionary<string, object> Catchall;
[OnSerializing]
void OnSerializing(StreamingContext ctx)
{
if (Catchall == null)
Catchall = new Dictionary<string, object>();
if (Bar != null)
Catchall[barName] = Bar.Value;
}
[OnSerialized]
void OnSerialized(StreamingContext ctx)
{
if (Catchall != null)
Catchall.Remove(barName);
}
[OnDeserialized]
void OnDeserializedMethod(StreamingContext context)
{
if (Catchall != null)
{
object value;
if (Catchall.TryGetValue(barName, out value))
{
try
{
if (value == null)
{
Bar = null;
}
else
{
Bar = (int)JToken.FromObject(value);
}
Catchall.Remove(barName);
}
catch (Exception)
{
Debug.WriteLine(string.Format("Value "{0}" of {1} was not an integer", value, barName));
}
}
}
}
}
请注意,我已将bar
更改为public int? Bar { get; set; }
。 null 值指示 Bar
的整数值未反序列化,因此,在重新序列化时,字典中的值(如果有)不应被属性的值取代。