[英]Parse multilingual json file into C# dictionary
如何讀入 C# 字典,形式為多語言 json 詞典:
[{
"Top": {
"de-DE": "Oben",
"fr-FR": "haut"
}
}, {
"Football": {
"de-DE": "Fußball",
},
},
{
"Taxi": {
}
}]
在 json 文件中有一個鍵,對於每種支持的語言,都有一個屬性和值。 如果目標語言中的單詞與鍵相同,則 json 文件中該鍵下沒有該語言的屬性。
在啟動時,我們僅將用戶語言的那些條目加載到 C# 字典中。 在這個片段中,德語詞典應該是
Top, Oben
Football, Fußball
Taxi, Taxi
法語
Top, Haut
Football, Football,
Taxi, Taxi
如何將 json 文件讀入 C# 字典? 字典並不大......數百而不是數百萬個條目,因此性能並不重要。
我假設你的 JSON 是數組列表
[
{
"Top": {
"de-DE": "Oben",
"fr-FR": "haut"
}
},
{
"Football": {
"de-DE": "Fußball"
}
},
{
"Taxi": {
}
}
]
您可以使用JsonConvert.DeserializeObject
將 json 轉換為Dictionary
var results = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(json);
//DE Dictionary
var deDict = results.SelectMany(x => x).ToDictionary(x => x.Key, x => JObject.Parse(x.Value.ToString())["de-DE"] == null ? "" : JObject.Parse(x.Value.ToString())["de-DE"].ToString());
//FR Dictionary
var frDict = results.SelectMany(x => x).ToDictionary(x => x.Key, x => JObject.Parse(x.Value.ToString())["fr-FR"] == null ? "" : JObject.Parse(x.Value.ToString())["fr-FR"].ToString());
//DE Dictionary
foreach (var keyvalue in deDict)
{
Console.WriteLine($"{keyvalue.Key} : {keyvalue.Value}");
}
//FR Dictionary
foreach (var keyvalue in frDict)
{
Console.WriteLine($"{keyvalue.Key} : {keyvalue.Value}");
}
輸出
Top : Oben
Football : Fußball
Taxi :
Top : haut
Football :
Taxi :
類型
public class LocalizationInfo : Dictionary<string, string>
{
public LocalizationInfo() : base( StringComparer.InvariantCultureIgnoreCase ) { }
}
public class LocalizationItem : Dictionary<string, LocalizationInfo>
{ }
public class LocalizationCollection : List<LocalizationItem>
{
public Dictionary<string, string> GetLocalizedDict( string cultureName )
{
if ( cultureName is null )
{
throw new ArgumentNullException( nameof( cultureName ) );
}
return this
.Where( e => e.Count == 1 )
.Select( e => e.First() )
.ToDictionary( e => e.Key, e => e.Value == null ? e.Key : e.Value.TryGetValue( cultureName, out var localizedValue ) ? localizedValue : e.Key );
}
public Dictionary<string, string> GetLocalizedDict( CultureInfo cultureInfo )
{
if ( cultureInfo is null )
{
throw new ArgumentNullException( nameof( cultureInfo ) );
}
return GetLocalizedDict(cultureInfo.Name);
}
public Dictionary<string, string> GetLocalizedDict( )
{
return GetLocalizedDict( CultureInfo.CurrentCulture );
}
}
和用例
class Program
{
static readonly string _json =
"[{" + Environment.NewLine +
" \"Top\": {" + Environment.NewLine +
" \"de-DE\": \"Oben\"," + Environment.NewLine +
" \"fr-FR\": \"haut\"" + Environment.NewLine +
" }" + Environment.NewLine +
"}, {" + Environment.NewLine +
" \"Football\": {" + Environment.NewLine +
" \"de-DE\": \"Fußball\"" + Environment.NewLine +
" }" + Environment.NewLine +
"}," + Environment.NewLine +
"{" + Environment.NewLine +
" \"Taxi\": {" + Environment.NewLine +
" }" + Environment.NewLine +
"}]";
static void Main( string[] args )
{
var data = JsonSerializer.Deserialize<LocalizationCollection>( _json );
var frDict = data.GetLocalizedDict( "fr-fr" );
var deDict = data.GetLocalizedDict( "de-de" );
var dict = data.GetLocalizedDict();
}
}
我選擇了這樣的結構
{
"Top": {
"de-DE": "Oben",
"fr-FR": "haut"
},
"Football": {
"de-DE": "Fußball"
},
"Taxi": {}
}
不需要包含僅包含單個屬性的對象的數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.