【发布时间】:2012-01-04 11:35:23
【问题描述】:
我正在使用 Newtonsoft.Json 程序集将 Json 字符串反序列化为动态对象 (ExpandoObject)。我遇到的问题是 int 值总是作为 Int64 返回,而我期待的是 Int32。代码如下。
namespace Serialization
{
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public static class JsonSerializer
{
#region Public Methods
public static string Serialize(dynamic obj)
{
return JsonConvert.SerializeObject(obj);
}
public static dynamic Deserialize(string s)
{
var obj = JsonConvert.DeserializeObject(s);
return obj is string ? obj as string : Deserialize((JToken)obj);
}
#endregion
#region Methods
private static dynamic Deserialize(JToken token)
{
// FROM : http://blog.petegoo.com/archive/2009/10/27/using-json.net-to-eval-json-into-a-dynamic-variable-in.aspx
// Ideally in the future Json.Net will support dynamic and this can be eliminated.
if (token is JValue) return ((JValue)token).Value;
if (token is JObject)
{
var expando = new ExpandoObject();
(from childToken in token
where childToken is JProperty
select childToken as JProperty).ToList().
ForEach(property => ((IDictionary<string, object>)expando).Add(property.Name, Deserialize(property.Value)));
return expando;
}
if (token is JArray)
{
var items = new List<object>();
foreach (var arrayItem in ((JArray)token)) items.Add(Deserialize(arrayItem));
return items;
}
throw new ArgumentException(string.Format("Unknown token type '{0}'", token.GetType()), "token");
}
#endregion
}
}
通常我不会注意到这一点,但是这个特殊的 int 正被用于反射以进行某些类型检查,但它失败了。任何想法为什么会发生这种情况将不胜感激。
【问题讨论】:
-
改用 jsonfx 修复! github.com/jsonfx/jsonfx/downloads
-
我同意你的看法。应该有一个反序列化为 Int32 的选项。或者一种嵌入 Int32 类型的方法。目前这让我很恼火。
-
@KaseySpeakman 你有没有找到解决方案?
-
不,由于时间不够,我最终改用 BinaryMessageFormatter。