Search code examples
c#asp.netserializationinternationalizationresx

ASP.NET *.resx serialization


I'm contributing on an I18N project and there's a call to serialize our *.resx files as JSON objects (for whatever reason).

What I'm wondering is:

  • Is there a way to get a list of all of the valid keys for a given *.resx file so that we could use HttpContext.GetGlobalResourceObject to grab the tokens?
  • If that won't work, has anyone come up with a clever solution that does?

Solution

  •   Sub ReadRessourceFile()
           ''#Requires Assembly System.Windows.Forms 
            Dim rsxr As System.Resources.ResXResourceReader = New System.Resources.ResXResourceReader("items.resx")
    
            ''# Iterate through the resources and display the contents to the console.    
            Dim d As System.Collections.DictionaryEntry
            For Each d In rsxr
                Console.WriteLine(d.Key.ToString() + ":" + ControlChars.Tab + d.Value.ToString())
            Next d
    
            ''#Close the reader. 
            rsxr.Close()
        End Sub
    

    Then you need to add this to a Serializable Dictionary, which you can then serialize to JSON using System.Web.Extensions.dll

    Public Class JSONHelper
    
    Public Shared Function Serialize(Of T)(ByVal obj As T) As String
        Dim JSONserializer As System.Web.Script.Serialization.JavaScriptSerializer = New System.Web.Script.Serialization.JavaScriptSerializer()  
        Return JSONserializer.Serialize(obj)
    End Function
    
    Public Shared Function Deserialize(Of T)(ByVal json As String) As T
        Dim obj As T = Activator.CreateInstance(Of T)()
        Dim JSONserializer As System.Web.Script.Serialization.JavaScriptSerializer = New System.Web.Script.Serialization.JavaScriptSerializer()
        obj = JSONserializer.Deserialize(Of T)(json)
        Return obj
    End Function
    
    End Class
    

    Edit: C# :

    public void ReadRessourceFile()
    {
        //Requires Assembly System.Windows.Forms '
        System.Resources.ResXResourceReader rsxr = new System.Resources.ResXResourceReader("items.resx");
    
        // Iterate through the resources and display the contents to the console. '    
        System.Collections.DictionaryEntry d = default(System.Collections.DictionaryEntry);
        foreach (DictionaryEntry d_loopVariable in rsxr) {
            d = d_loopVariable;
            Console.WriteLine(d.Key.ToString() + ":" + ControlChars.Tab + d.Value.ToString());
        }
    
        //Close the reader. '
        rsxr.Close();
    }
    

    And the JSON helper:

    public class JSONHelper
    {
    
        public static string Serialize<T>(T obj)
        {
            System.Web.Script.Serialization.JavaScriptSerializer JSONserializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            return JSONserializer.Serialize(obj);
        }
    
        public static T Deserialize<T>(string json)
        {
            T obj = Activator.CreateInstance<T>();
            System.Web.Script.Serialization.JavaScriptSerializer JSONserializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            obj = JSONserializer.Deserialize<T>(json);
            return obj;
        }
    
    }
    

    Also, if you want to get the comment as well, you can set UseResXDataNodes to true.
    Example:

    public static string ReadRessourceFile()
    {
        string[] languages = new string[] { "de", "fr", "it", "en" };
        string pathPattern = System.AppDomain.CurrentDomain.BaseDirectory;
        pathPattern = System.IO.Path.Combine(pathPattern, "..", "..", "..", "libQrCodeGenerator", "Resources", "QRBillText-{0}.resx");
        pathPattern = System.IO.Path.GetFullPath(pathPattern);
    
        System.Collections.Generic.Dictionary<string, System.Collections.Generic.Dictionary<string, string>> dict = new System.Collections.Generic.Dictionary<string, System.Collections.Generic.Dictionary<string, string>>(System.StringComparer.InvariantCultureIgnoreCase);
    
        foreach (string lang in languages)
        {
            dict[lang] = new System.Collections.Generic.Dictionary<string, string>(System.StringComparer.InvariantCultureIgnoreCase);
    
            string file = string.Format(pathPattern, lang);
            System.Resources.ResXResourceReader rr = new System.Resources.ResXResourceReader(file);
            rr.UseResXDataNodes = true;
    
            // '# Iterate through the resources and display the contents to the console. 
            foreach (System.Collections.DictionaryEntry d in rr)
            {
                System.Resources.ResXDataNode node = (System.Resources.ResXDataNode)d.Value;
                string value = (string) node.GetValue((System.ComponentModel.Design.ITypeResolutionService)null);
                string comment = node.Comment;
    
                if(!string.IsNullOrEmpty(comment))
                {
                    System.Console.WriteLine(comment);
                }
    
                // dict[lang][d.Key.ToString()] = d.Value.ToString(); // when not using UseResXDataNodes = true
                dict[lang][d.Key.ToString()] = value;
            }
    
            // '#Close the reader. 
            rr.Close();
        }
    
        string json = Newtonsoft.Json.JsonConvert.SerializeObject(dict, Newtonsoft.Json.Formatting.Indented);
        return json;
    }