我需要将复杂的JSON blob反序列化为标准的.NET容器,以便在不了解JSON的代码中使用.它期望的事情是在标准的.NET类型,具体地Dictionary<string, object>或List<object>其中"对象"可以是原语或递归(词典或列表).
我不能使用静态类型来映射结果,并且JObject/JToken不适合.理想情况下,有一些方法(通过Contracts可能?)将原始JSON转换为基本的.NET容器.
我一直在寻找任何方式来哄骗JSON.NET反序列化器在遇到"{}"或"[]"时创建这些简单类型,但收效甚微.
任何帮助赞赏!
将对象反序列化为Dictionary(JsonConvert.DeserializeObject<IDictionary<string,object>>(json))嵌套对象时,将其反序列化为JObjects.是否可以强制嵌套对象反序列化为Dictionarys?
我正在使用ToBsonDocument扩展方法MongoDB.Bson来转换这个字典:
var dictionary = new Dictionary<string, object> {{"person", new Dictionary<string, object> {{"name", "John"}}}};
var document = dictionary.ToBsonDocument();
Run Code Online (Sandbox Code Playgroud)
这是结果文件:
{ "person" :
{ "_t" : "System.Collections.Generic.Dictionary`2[System.String,System.Object]",
"_v" : { "name" : "John" } } }
Run Code Online (Sandbox Code Playgroud)
有没有办法摆脱这些_t/_v的东西?我希望生成的文档看起来像这样:
{ "person" : { "name" : "John" } }
Run Code Online (Sandbox Code Playgroud)
UPD:我在DictionaryGenericSerializer中找到了代码:
if (nominalType == typeof(object))
{
var actualType = value.GetType();
bsonWriter.WriteStartDocument();
bsonWriter.WriteString("_t", TypeNameDiscriminator.GetDiscriminator(actualType));
bsonWriter.WriteName("_v");
Serialize(bsonWriter, actualType, value, options); // recursive call replacing nominalType with actualType
bsonWriter.WriteEndDocument();
return;
}
Run Code Online (Sandbox Code Playgroud)
因此,当值类型为时,似乎没有太多选项可用于此序列化程序object.
让我们说我们有一个关键值,它们的意义上是多态的.考虑下一个示例项目:
public class ToBeSerialized
{
[BsonId]
public ObjectId MongoId;
public IDictionary<string, BaseType> Dictionary;
}
public abstract class BaseType
{
}
public class Type1 : BaseType
{
public string Value1;
}
public class Type2:BaseType
{
public string Value1;
public string Value2;
}
internal class Program
{
public static void Main()
{
var objectToSave = new ToBeSerialized
{
MongoId = ObjectId.GenerateNewId(),
Dictionary = new Dictionary<string, BaseType>
{
{"OdEd1", new Type1 {Value1="value1"}},
{
"OdEd2",
new Type1 {Value1="value1"}
}
}
};
string connectionString = …Run Code Online (Sandbox Code Playgroud)