我遇到了这种(看似平常)的情况,但是找不到令人满意的解决方案。也许有人知道:
出于某种原因,我解析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装饰,对我有用。但这确实不必要。
答案 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