对json数据进行处理的小程序总结

有个任务要做多语言切换功能,然后需要用到json资源包,参数对应显示的数据,一个简体资源包一个繁体的,由于中文会乱码,需要对显示的数据进行unicode编码,UTF-8也可以。手动录入的话太麻烦了,既要来回切换简繁输入,又要在线对数据进行编码,再复制粘贴到json文件中,工作量太大而且一直复制粘贴太傻逼了,所以就考虑通过写个窗体小程序实现。

想要的原始数据是参数和对应简体的json数据格式的txt文件。 

格式如下:

{
    "query": "查询",
    "url": "地址",
    "page": "页码",
    "address": {
        "street": "科技园路.",
        "city": "江苏苏州",
        "country": "中国"
    }
}

想要的输出是两个转换后的txt文件,格式如下:

{
	" query": "\u67e5\u8be2",
	" url": "\u5730\u5740",
	" page": "\u9875\u7801",
	" address": {
		" street": "\u79d1\u6280\u56ed\u8def\u002e",
		" city": "\u6c5f\u82cf\u82cf\u5dde",
		" country": "\u4e2d\u56fd"
	}
}

用到的方法总结:

一、C# winform写入和读取TXT文件
 

string str;
str=this.textBox1.Text;
StreamWriter sw = new StreamWriter(Application.StartupPath +"\\txtwriter.txt", false);
sw.WriteLine(str);
sw.Close();//写入

string str;
StreamReader sr = new StreamReader(Application.StartupPath +"\\txtreader.txt", false);
str = sr.ReadLine().ToString();
sr.Close();
this.textBox1.Text = str;///读取

 

二、简繁体切换

添加引用Microsoft.VisualBasic

string strSimple = Microsoft.VisualBasic.Strings.StrConv(strTraditional, VbStrConv.SimplifiedChinese, 0); 
string strTraditional = Microsoft.VisualBasic.Strings.StrConv(strSimple, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0); 

 

三、json对象的转换及拼接

添加引用Newtonsoft.Json

JObject jo = (JObject)JsonConvert.DeserializeObject(str);
            foreach (var a in jo)
            {
                if (!string.IsNullOrEmpty(simpleStr))
                {
                    simpleStr += ",";
                    diffStr += ",";
                }
                else
                {
                    simpleStr += "{";
                    diffStr += "{";
                }
                simpleStr += "\" " + a.Key + "\":";
                diffStr += "\" " + a.Key + "\":";
                if (a.Value.HasValues)
                {
                    simpleStr += "{";
                    diffStr += "{";
                    bool isfirst = true;
                    JObject childJo = (JObject)JsonConvert.DeserializeObject(a.Value.ToString());
                    foreach (var b in childJo)
                    {
                        if (!isfirst)
                        {
                            simpleStr += ",";
                            diffStr += ",";
                        }
                        else
                        {
                            isfirst = false;
                        }
                        simpleStr += "\" " + b.Key + "\":";
                        diffStr += "\" " + b.Key + "\":";
                        simpleStr += "\"" + String2Unicode(b.Value.ToString()) + "\"";
                        diffStr += "\"" + String2Unicode(Microsoft.VisualBasic.Strings.StrConv(b.Value.ToString(), Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0)) + "\"";
                    }
                    simpleStr += "}";
                    diffStr += "}";
                }
                else
                {
                    simpleStr += "\"" + String2Unicode(a.Value.ToString()) + "\"";
                    diffStr += "\"" + String2Unicode(Microsoft.VisualBasic.Strings.StrConv(a.Value.ToString(), Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0)) + "\"";
                }
            }
            simpleStr += "}";
            diffStr += "}";

 

四、unicode编码

using System.Text.RegularExpressions;

/// <summary>
        /// 字符串转Unicode
        /// </summary>
        /// <param name="source">源字符串</param>
        /// <returns>Unicode编码后的字符串</returns>
        internal static string String2Unicode(string source)
        {
            var bytes = Encoding.Unicode.GetBytes(source);
            var stringBuilder = new StringBuilder();
            for (var i = 0; i < bytes.Length; i += 2)
            {
                stringBuilder.AppendFormat("\\u{0}{1}", bytes[i + 1].ToString("x").PadLeft(2, '0'), bytes[i].ToString("x").PadLeft(2, '0'));
            }
            return stringBuilder.ToString();
        }

        /// <summary>
        /// Unicode转字符串
        /// </summary>
        /// <param name="source">经过Unicode编码的字符串</param>
        /// <returns>正常字符串</returns>
        internal static string Unicode2String(string source)
        {
            return new Regex(@"\\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace(source, x => Convert.ToChar(Convert.ToUInt16(x.Result("$1"), 16)).ToString());
        }

     

五、过程中出现的错误

读取txt文件时中文乱码,StreamReader sR = new StreamReader(filePath, System.Text.Encoding.Default)

采用默认编码或者Encoding.GetEncoding("gb2312")可解决问题

json里面value还有数据的时候需要对里面的再进行反序列化成对象进行处理,不能直接处理。

最后就是犯了很多细节上的小问题,另外很多知识点都不熟悉了

 

最后说一下多语言切换用到的资源包不要这样弄,因为数据的key和value都很难看懂,最好的办法是在json文件保存的时候编码给设置为unicode编码或UTF-8编码,这样就不会出现乱码了,而且key值就可以设置为中文,比较容易看懂

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值