Dan*_*iel 33 c# serialization json json.net deserialization
将对象反序列化为Dictionary
(JsonConvert.DeserializeObject<IDictionary<string,object>>(json)
)嵌套对象时,将其反序列化为JObject
s.是否可以强制嵌套对象反序列化为Dictionary
s?
Ale*_*exD 43
我找到了一种Dictionary<string,object>
通过提供CustomCreationConverter
实现来转换所有嵌套对象的方法:
class MyConverter : CustomCreationConverter<IDictionary<string, object>>
{
public override IDictionary<string, object> Create(Type objectType)
{
return new Dictionary<string, object>();
}
public override bool CanConvert(Type objectType)
{
// in addition to handling IDictionary<string, object>
// we want to handle the deserialization of dict value
// which is of type object
return objectType == typeof(object) || base.CanConvert(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartObject
|| reader.TokenType == JsonToken.Null)
return base.ReadJson(reader, objectType, existingValue, serializer);
// if the next token is not an object
// then fall back on standard deserializer (strings, numbers etc.)
return serializer.Deserialize(reader);
}
}
class Program
{
static void Main(string[] args)
{
var json = File.ReadAllText(@"c:\test.json");
var obj = JsonConvert.DeserializeObject<IDictionary<string, object>>(
json, new JsonConverter[] {new MyConverter()});
}
}
Run Code Online (Sandbox Code Playgroud)
文档:带有Json.NET的CustomCreationConverter
当我遇到这个问题时,我有一个非常相似但稍微复杂的需求。起初我想也许我可以调整接受的答案,但这似乎有点复杂,我最终采取了不同的方法。我试图在传统的 C++ API 之上放置一个现代 JSON 层。我会省去你的细节,只是说要求归结为:
JSON 对象变为Dictionary<string,object>
.
JSON 数组变为List<object>
.
JSON 值成为相应的原始 CLR 值。
对象和数组可以无限嵌套。
我首先将请求字符串反序列化为Newtonsoft JSON对象,然后调用我的方法按照上述要求进行转换:
var jsonObject = JsonConvert.DeserializeObject(requestString);
var apiRequest = ToApiRequest(jsonObject);
// call the legacy C++ API ...
Run Code Online (Sandbox Code Playgroud)
这是我转换为 API 期望结构的方法:
private static object ToApiRequest(object requestObject)
{
switch (requestObject)
{
case JObject jObject: // objects become Dictionary<string,object>
return ((IEnumerable<KeyValuePair<string, JToken>>) jObject).ToDictionary(j => j.Key, j => ToApiRequest(j.Value));
case JArray jArray: // arrays become List<object>
return jArray.Select(ToApiRequest).ToList();
case JValue jValue: // values just become the value
return jValue.Value;
default: // don't know what to do here
throw new Exception($"Unsupported type: {requestObject.GetType()}");
}
}
Run Code Online (Sandbox Code Playgroud)
我希望有人能发现这种方法很有用。
归档时间: |
|
查看次数: |
20182 次 |
最近记录: |