Json与类对象转换

Json在js,jquery中可以直接使用,比如下串:

{

  "from":"en"

  ,"to":"zh"

  ,"trans_result":

    [

      {"src":"today","dst":"\u4eca\u5929"}

    ]

}

可以直接使用data.from即可获取到”en”.

 

但是在c#中不可以。要获取值,有三种方法:

  1. string的方法,找到节点索引、获取子串;
  2. string=>xmlNode,再读节点值
  3. 利用Newtonsoft.Json,直接将json与类对象互相转换,这样很方便,之后可以像js一样智能感应的使用对象的属性(即json的节点值)。

前提是:编写对应于json串节点的类!这点可以利用工具解决,生成好后复制类代码即可。详见:

http://json2csharp.com/

http://jsonclassgenerator.codeplex.com/

注意的是:

  1. 类属性和json节点值的大小写无关,不影响使用。
  2. json与类对象互相转换后字符串的编码可能变化。这点稍注意。

 

以下简述Newtonsoft.Json的使用。详见示例:BaiduTranslate.TestConsole

  1. 生成类

  2.引入对应版本的Newtonsoft.Json。

  3.使用obj=>json,或者json=>obj

 

下面贴代码:是用c#写百度翻译的

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Net;
 6 using System.IO;
 7 using Newtonsoft.Json;
 8 
 9 namespace BaiduTranslate.TestConsole
10 {
11     /// <summary>
12     /// json根节点
13     /// </summary>
14     public class RootObject
15     {
16         public string From { get; set; }
17         public string To { get; set; }
18         public List<TransResult> Trans_result { get; set; }
19     }
20     /// <summary>
21     /// json子节点
22     /// </summary>
23     public class TransResult
24     {
25         public string Src { get; set; }
26         public string Dst { get; set; }
27     }
28 
29 
30     class Program
31     {
32         static void Main(string[] args)
33         {
34             Console.Write("请输入待翻译单词:");
35             string english = Console.ReadLine().Trim();
36 
37             string requestUrl = string.Format(System.Configuration.ConfigurationManager.AppSettings["TransferUrl"],english);
38             HttpWebRequest mRequest = (HttpWebRequest)WebRequest.Create(requestUrl);
39             WebResponse resp = mRequest.GetResponse();
40             if (resp != null)
41             {
42                 var streamReader = new StreamReader(resp.GetResponseStream());
43                 #region 翻译返回json字符串的形式
44                 //正常结果
45                 //{
46                 //  "from":"en"
47                 //  ,"to":"zh"
48                 //  ,"trans_result":
49                 //    [
50                 //      {"src":"today","dst":"\u4eca\u5929"}
51                 //    ]
52                 //}
53                 //出错结果,则显示如下,但该字符串经过转换后不会出错,RootObject的From\To属性正常有值,Trans_result为null
54                 //{"error_code":"52003","error_msg":"UNAUTHORIZED USER","from":"auto","to":"auto","monLang":"zh","query":"today"} 
55                 #endregion
56                 string result = streamReader.ReadToEnd();
57                 //json=>obj,使用Newtonsoft.Json将json字符串转成合适的对象,并将汉字编码也转成成汉字
58                 RootObject data = JsonConvert.DeserializeObject<RootObject>(result);
59 
60                 #region obj=>json
61                 //使用Newtonsoft.Json将对象转成json字符串
62                 //值和原字符串result相同,只是属性名大写且是汉字
63                 //string strJsonTest = JsonConvert.SerializeObject(data);
64                 #endregion
65 
66                 if (data.Trans_result != null)
67                     Console.WriteLine(string.Format("翻译结果:{0}", data.Trans_result[0].Dst));
68                 else
69                     Console.WriteLine("可能是密钥错误或网络错误");
70             }
71             else
72             {
73                 Console.WriteLine("网络错误");
74             }
75 
76             Console.ReadLine();
77         }
78     }
79 }
View Code

 

 

posted on 2014-06-03 16:31  nlh774  阅读(1325)  评论(0编辑  收藏  举报