c# - 反序列化json时出现异常

标签 c# asp.net json deserialization json-deserialization

我有两种方法

public static string SerializeObject<T>(T value)
{
    if (value == null)
    {
        return null;
    }

    var dictionaryObject = new Dictionary<string, object> { { typeof(T).Name, value } };

    var jsonString = JsonConvert.SerializeObject(dictionaryObject);

    return jsonString;
}

public static T DeserializeObject<T>(string jsonString)
{
    var objectValue = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);
    return JsonConvert.DeserializeObject<T>(objectValue.Values.First().ToString());
}

当我反序列化一个类型为 json 的字符串时

ConcurrentDictionary<KeyValuePair<long, long>, IList<string>>

我有一个异常(exception):

无法将字符串“[1, 1]”转换为字典键类型“System.Collections.Generic.KeyValuePair`2[System.Int64,System.Int64]”。创建一个 TypeConverter 以将字符串转换为键类型对象。路径“[1, 1]”,第 2 行,位置 12。

那么有人可以告诉我正确的代码吗?

这是我的代码:

var test = new ConcurrentDictionary<KeyValuePair<long, long>, IList<string>>();
test.TryAdd(new KeyValuePair<long, long>(1, 1), new List<string> { "Test" });

var se = SerializeObject(test);

var de = DeserializeObject<ConcurrentDictionary<KeyValuePair<long, long>, IList<string>>>(se);

最佳答案

我不确定这是否是最好的解决方案,但是请试试这个:

1) 按照 this topic 中的描述创建 ContractResolver .

class DictionaryAsArrayResolver : DefaultContractResolver
        {
            protected override JsonContract CreateContract(Type objectType)
            {
                if (objectType.GetInterfaces().Any(i => i == typeof(IDictionary) ||
                    (i.IsGenericType &&
                     i.GetGenericTypeDefinition() == typeof(IDictionary<,>))))
                {
                    return base.CreateArrayContract(objectType);
                }

                return base.CreateContract(objectType);
            }
        }

2) 稍微改变一下你的序列化/反序列化方法:

public static string SerializeObject<T>(T value, JsonSerializerSettings settings)
        {
            if (value == null)
            {
                return null;
            }

            var dictionaryObject = new Dictionary<string, object> { { typeof(T).Name, value } };
            var jsonString = JsonConvert.SerializeObject(dictionaryObject, settings);

            return jsonString;
        }

        public static T DeserializeObject<T>(string jsonString, JsonSerializerSettings settings)
        {
            var objectValue = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString, settings);
            return JsonConvert.DeserializeObject<T>(objectValue.Values.First().ToString(), settings);
        }

3) 检查测试:

[TestMethod]
        public void Test()
        {
            var test = new ConcurrentDictionary<KeyValuePair<long, long>, IList<string>>();
            test.TryAdd(new KeyValuePair<long, long>(1, 1), new List<string> { "Test" });

            JsonSerializerSettings settings = new JsonSerializerSettings();
            settings.ContractResolver = new DictionaryAsArrayResolver();

            var se = SerializeObject(test, settings);

            var de = DeserializeObject<ConcurrentDictionary<KeyValuePair<long, long>, IList<string>>>(se, settings);
        }

希望对您有所帮助 =)

关于c# - 反序列化json时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37693221/

相关文章:

c# - 警告 : Page Has Expired

angularjs - 通过 Cloud9 从 WordPress 获取 JSON 文件会返回 Cloud9 html 文件

c# P/调用 : Pass Enum value with IntPtr to Function; AccessViolationException

c# - 从多个列表或数组中搜索/过滤(可能数十亿)项目组合的最佳方式

c# - 成功删除记录时 ExecuteNonQuery 返回值 0

c# - ASP Grid View,预定义行高大小

c# - 限制 ASP.net 下拉菜单

c# - Entity Framework FK 错误

javascript - 如何将此字符串转换为 JSON 对象?

javascript - AngularJS 中的 ng-repeat 未正确绑定(bind)