使用JSON.NET和DATABINDING的字典避免使用仅读取值



我正在编写带有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);
        }

相关内容

  • 没有找到相关文章

最新更新