如何使用JSON.Net将JsonExtensionData(Dictionary <string,jtoken =“”>)应用于另一个对象

时间:2018-10-13 11:00:36

标签: 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/html/DeserializeExtensionData.htm
    [JsonExtensionData]
    private Dictionary<string, JToken> _extparams;
}

如果我反序列化类似的东西

{
   "TypeName": "a",
   "stuff": 3
}

将设置TypeName,并且我的_extparams包含键“ stuff”。

由于某种原因,我想将存储的数据应用于另一个(刚刚创建的)对象“ obj”(实际上,该参数被认为是该类型名称thing)。 所以我有一个词典和一个对象。有没有一种方法可以“应用”字典而不先对其进行序列化?

我不满意的解决方案是这样:

string json = JsonConvert.SerializeObject(_extparams);
JsonConvert.PopulateObject(json, obj);

用一些JsonSerializerSettings装饰,对我有用。但这确实不必要。

1 个答案:

答案 0 :(得分:3)

Json.Net没有可以直接从标准字典填充对象的方法。毕竟,它是一个序列化库,而不是映射库。也就是说,有一种无需中间序列化/反序列化步骤即可使其工作的方法。

首先,不要使用Dictionary<string, JToken>作为[JsonExtensionData]参数的容器。 JObject实现了JObject,因此它仍然可以捕获额外的属性。

IDictionary<string, JToken>

然后,要填充另一个对象,只需从class MusterNode { ... [JsonExtensionData] private JObject _extparams; } 创建一个读取器,然后将其传递给JObject,如下所示:

JsonSerializer.Populate()

如果您需要特定的序列化设置,则可以在调用new JsonSerializer().Populate(_extparams.CreateReader(), obj); 之前直接在JsonSerializer上进行设置。

这是一个有效的演示:https://dotnetfiddle.net/kIzc5G