我正在编写带有C#和UWP的JSON文件的编辑器。
我已经成功地进入了我的JSON中的translations
字典。
{
"characters": [{
"name": "guy",
"picture": "thing.png",
"lines": [{
"phrase": "hello",
"translations": {
"en": "Hi there, this is some text.",
"es": ""
}
}]
}]
}
到目前为止,一切都具有一致的命名,我可以轻松解析-name
始终由字符串name
表示,因此我不需要使用字典。
但是,当解析translations
时,我可以支持任何数量的语言。这意味着我需要一个字典。
通常,我的Lines
对象包含以下内容:
private Dictionary<string, string> translations;
[JsonProperty(PropertyName = "translations")]
public Dictionary<string, string> Translations
{
get { return translations; }
set
{
translations = value;
OnPropertyChanged("Translations");
}
}
如果我只是显示数据,这将正常工作。但是,在我的应用程序中,我需要双向数据指标。这意味着我将不得不写信给我的字典的 value
-这是我做不到的,因为它是 readonly
。
我考虑过将自定义对象用作我的Dictionary
的值,如以下内容:
...
public Dictionary<string, Translation> Translations
...
用对象
public class Translation
{
public string Text { get; set; }
}
但是,这不起作用,JSON.NET引发了解析异常 - 这很有意义。JSON.NET不知道如何将其认为是string
转换为我的自定义Translation
Text
属性。
是否可以使用与[JsonProperty]
相似的标签,这可以让我使用此功能?谢谢。
只有一些笔记 - 我打算将此.json
文件与Unity项目一起使用,这意味着我不能使用dynamic
关键字之类的好东西。
您可以使用序列化/避风式回调进行手动转换:
[JsonProperty(PropertyName = "translations")]
private Dictionary<string, string> TranslationsSerialized { get; set; }
private Dictionary<string, Translation> translations;
[JsonIgnore]
public Dictionary<string, Translation> Translations
{
get { return translations; }
set
{
translations = value;
OnPropertyChanged("Translations");
}
}
[OnDeserialized]
private void OnDeserialized(StreamingContext ctx)
{
Translations = TranslationsSerialized?.ToDictionary(t => t.Key, t => new Translation { Text = t.Value });
}
[OnSerializing]
private void OnSerializing(StreamingContext context)
{
TranslationsSerialized = Translations?.ToDictionary(t => t.Key, t => t.Value.Text);
}