反序列化json时出现异常。

5

我有两种方法

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>>

我有一个异常:
无法将字符串'[1, 1]'转换为字典键类型'System.Collections.Generic.KeyValuePair`2[System.Int64,System.Int64]'。创建一个类型转换器,以将字符串转换为键类型对象。路径'[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);

你为什么要把它转换成字典? - Toxicable
您可能需要更详细地解释一下您想要实现的目标。不确定您尝试使用字典解决什么问题。 - d512
@user1334007:我正在尝试将一个 JSON 字符串反序列化为一个类型为 ConcurrentDictionary<KeyValuePair<long,long>,IList<string>> 的对象。 - Vũ Hoàng
只需删除字典部分,它是无意义的。此外,您有一些相当奇怪的数据结构,也许尝试使用类作为DTO(数据传输对象),它将大大简化您的代码并使其更加合乎逻辑。 - Toxicable
1个回答

3
我不确定这是否是最好的解决方案,但是请尝试以下方法:
1)按照此主题中所述创建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);
        }

我希望你能帮到你 =)

它有效了,感谢您的解决方案 :) @Johnny Svarog - Vũ Hoàng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接