我有一个单级 json,我想将其反序列化为Dictionary<string,object>
using Json.Net.
字典的值可以是基元、字符串或(基元\字符串)数组。
反序列化知道如何处理基元和字符串,但是当它到达基元数组时,它会将其反序列化为JArray
(而不是原始数组)。
这是我的意思的一个小代码示例:
string jsonStr = @"{""obj"": 7, ""arr"": ['1','2','3']}";
Dictionary<string, object> dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonStr);
dict["obj"].GetType(); // long
dict["arr"].GetType(); // JArray. I would like this to be string[].
我正在寻找一种可以干扰反序列化过程并创建原始数组的方法,而不是陷入困境JArray
.
我试过用JsonSerializerSettings
,但无法确定位置。
这是执行此操作的一种巧妙方法。我创建了一个自定义 JsonConverter 类,它接受 2 个通用参数:T1 和 T2。 T1 给出数组的类型(在本例中为字符串),T2 给出另一个对象的类型(在本例中为 long)。我认为我们基本上想要一本字典,但这部分肯定可以改进。
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string jsonStr = @"{""obj"": 7, ""arr"": ['1','2','3']}";
Dictionary<string, object> dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonStr, new SpecialConverter<string, long>());
dict["obj"].GetType(); // long
dict["arr"].GetType(); // string[].
}
class SpecialConverter<T1, T2> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
var result = new Dictionary<string, object>();
if (result.GetType() == objectType)
{
foreach (var item in token)
{
var prop = (JProperty)item;
if (prop.Value.Type == JTokenType.Array)
{
result.Add(prop.Name, prop.Value.ToObject<T1[]>());
}
else
{
result.Add(prop.Name, prop.Value.ToObject<T2>());
}
}
return result;
}
else
{
return null;
}
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)