Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用JSON.Net将JsonExtensionData(Dictionary<;string,JToken>;)应用于另一个对象_C#_.net_Json_Serialization_Json.net - Fatal编程技术网

C# 如何使用JSON.Net将JsonExtensionData(Dictionary<;string,JToken>;)应用于另一个对象

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

我遇到了这种(看似平常的)情况,但我找不到令人满意的解决方案。也许有人知道:

出于某种原因,我解析JSON并允许用户提供比我的类的属性更多的键值对。我将任意的存储起来,如下所示:

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