C# 如何使用JSON.Net将JsonExtensionData(Dictionary<;string,JToken>;)应用于另一个对象
我遇到了这种(看似平常的)情况,但我找不到令人满意的解决方案。也许有人知道: 出于某种原因,我解析JSON并允许用户提供比我的类的属性更多的键值对。我将任意的存储起来,如下所示:C# 如何使用JSON.Net将JsonExtensionData(Dictionary<;string,JToken>;)应用于另一个对象,c#,.net,json,serialization,json.net,C#,.net,Json,Serialization,Json.net,我遇到了这种(看似平常的)情况,但我找不到令人满意的解决方案。也许有人知道: 出于某种原因,我解析JSON并允许用户提供比我的类的属性更多的键值对。我将任意的存储起来,如下所示: class MusterNode { // some definite property public string TypeName { get; set; } // takes the rest // see https://www.newtonsoft.com/json/help
class MusterNode
{
// some definite property
public string TypeName { get; set; }
// takes the rest
// see https://www.newtonsoft.com/json/help/html/DeserializeExtensionData.htm
[JsonExtensionData]
private Dictionary<string, JToken> _extparams;
}
TypeName将被设置,my_extparams包含一个键“stuff”
出于某种原因,我想将存储的数据应用到另一个(刚刚创建的)对象“obj”(事实上,这些参数是为typename thingy考虑的)。
所以我有一本字典和一个对象。有没有一种方法可以“应用”词典而不首先序列化它
我不满意的解决方案是:
string json = JsonConvert.SerializeObject(_extparams);
JsonConvert.PopulateObject(json, obj);
用一些JsonSerializerSettings装饰,这对我来说很有用。但是它会做不必要的工作。Json.Net没有一个方法可以直接从标准字典填充对象。毕竟,它是一个序列化库,而不是一个映射库。也就是说,有一种方法可以使它在不使用中间序列化/反序列化步骤的情况下工作 首先,不要使用
字典
作为[JsonExtensionData]
参数的容器,而是使用作业对象
JObject
实现了IDictionary
,因此它仍然可以捕获额外的属性
class MusterNode
{
...
[JsonExtensionData]
private JObject _extparams;
}
然后,要填充另一个对象,只需从JObject
创建一个读卡器,并将其传递给JsonSerializer.populate()
,如下所示:
new JsonSerializer().Populate(_extparams.CreateReader(), obj);
如果您有需要的特定序列化设置,可以在调用Populate()
之前直接在JsonSerializer
上进行设置
这是一个有效的演示:您的
obj的类型是什么?
?对于这个问题,它并不重要。想象一下,序列化的键值对与对象的属性和类型匹配(由Intelligence提供)就像快照一样工作。谢谢序列化设置可以这样设置:new JsonSerializer(){Converters={new RGBPixelConverter()},MissingMemberHandling=MissingMemberHandling.Error,}.Populate(_extparams.CreateReader(),obj);
new JsonSerializer().Populate(_extparams.CreateReader(), obj);