簡體   English   中英

將多語言 json 文件解析為 C# 字典

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM