GVKun编程网logo

C#将集合和Json格式互相转换的几种方式(c# 集合转字符串)

18

本文的目的是介绍C#将集合和Json格式互相转换的几种方式的详细情况,特别关注c#集合转字符串的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解C#将集合和Json格式

本文的目的是介绍C#将集合和Json格式互相转换的几种方式的详细情况,特别关注c# 集合转字符串的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解C#将集合和Json格式互相转换的几种方式的机会,同时也不会遗漏关于ABAP和XML数据格式互相转换的两种方式、C# 对象与JSON字符串互相转换的三种方式、C#中对象与JSON字符串互相转换的三种方式、jackson java对象和json对象的互相转换的知识。

本文目录一览:

C#将集合和Json格式互相转换的几种方式(c# 集合转字符串)

C#将集合和Json格式互相转换的几种方式(c# 集合转字符串)

转自http://blog.sina.com.cn/s/blog_84ee61a901018erd.html

  1. 使用微软自带的System.Web.Extensions.dll

    该DLL文件一般存在于如下路径:c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Web.Extensions.dll

//将List集合转换为Json字符串,
JavaScriptSerializer serializer = new JavaScriptSerializer();
List<Person> list = new List<Person>();
for (int i = 0; i < 10; i++)
{
    Person p = new Person("张三" + i, "重庆" + i, "10" + i);
    list.Add(p);
}
MessageBox.Show(serializer.Serialize(list));

//将Json字符串转换为集合,Person为自己定义的实体类
    string json = "[{''Address'':''重庆0'',''Age'':''100'',''Name'':''张三0''},{''Address'':''重庆1'',''Age'':''101'',''Name'':''张三1''}]";
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    List<Person> list = serializer.Deserialize<List<Person>>(json);

2. MVC程序的话,可以直接用Json(sssss)

ABAP和XML数据格式互相转换的两种方式

ABAP和XML数据格式互相转换的两种方式

ABAP和XML数据格式互相转换是广大开发人员经常遇到的需求。本文介绍两种方式。

1. ABAP提供了一个工具类cl_proxy_xml_transform,通过它的两个方法abap_to_xml_xstring和xml_xstring_to_abap实现两种格式的互换。

看具体例子:

REPORT zxm.

DATA: ls_abap TYPE zzcrmost__pro001dotproduct1.

DATA: ls_line LIKE LINE OF ls_abap-item.

ls_line-logsys = ‘AG3‘.

ls_line-object_family = ‘0401‘.

ls_line-product_id = ‘MCF-0001‘.

ls_line-product_type = ‘01‘.

APPEND ls_line TO ls_abap-item.

ls_line-logsys = ‘QDD‘.

ls_line-object_family = ‘0402‘.

ls_line-product_id = ‘MCF-0002‘.

ls_line-product_type = ‘02‘.

APPEND ls_line TO ls_abap-item.

DATA(xml) = cl_proxy_xml_transform=>abap_to_xml_xstring( EXPORTING abap_data = ls_abap ddic_type = ‘ZZCRMOST__PRO001DOTPRODUCT1‘ ).

DATA: ls_abap2 LIKE ls_abap,ls_abap3 LIKE ls_abap.

cl_proxy_xml_transform=>xml_xstring_to_abap( EXPORTING ddic_type = ‘ZZCRMOST__PRO001DOTPRODUCT1‘ xml = xml IMPORTING abap_data = ls_abap2 ).

ASSERT ls_abap2 = ls_abap.

最后一行的ASSERT语句,说明从ABAP格式转换成XML格式,再转换成ABAP格式,转换前的ABAP数据和转换后的ABAP数据是完全相同的。

上述ABAP代码使用到的结构体zzcrmost__pro001dotproduct1类型定义如下:

分享图片

如果我们单步调试工具类cl_proxy_xml_transform,发现它也没有神奇之处,

分享图片

内部生成了一个ABAP simple transformation,以此来实现ABAP和XML格式的互相转换。

分享图片

在调试器里记录下这个生成的transformation ID,然后用事务码STRANS打开,就可以看到明细了。

分享图片

2. 有了方法1单步调试发现simple transformation的提示,我们可以用另一种更简单的办法实现两种格式的互换,即直接调用simple transformation:

DATA: lv_xml TYPE string.

CALL TRANSFORMATION id SOURCE b = ls_abap RESULT XML lv_xml.

生成的XML的根节点名称为b,因为上面代码调用参数SOURCE,将ABAP变量ls_abap传入时,绑定的参数名为“b”。

CALL TRANSFORMATION id SOURCE XML lv_xml RESULT b = ls_abap3.

ASSERT ls_abap2 = ls_abap3. 用这种方式进行ABAP->XML->ABAP仍然能得到最初的ABAP变量的值。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

分享图片

分享图片

C# 对象与JSON字符串互相转换的三种方式

C# 对象与JSON字符串互相转换的三种方式

<div id="cnblogs_post_body"><h1>C# 对象与JSON字符串互相转换的三种方式</h1> <p>JSON(JavaScript&nbsp;Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。</p> <p>  关于内存对象和JSON字符串的相互转换,在实际项目中应比较广泛,经过一番搜索,找到如下三种方法来解决此问题</p> <p>分别是使用&nbsp;<strong>Newtonsoft.Json.dll、</strong><strong>DataContractJsonSerializer</strong>、&nbsp;<strong>JavaScriptSerializer。</strong>&nbsp;</p> <h2>方法一:&nbsp;<strong>Newtonsoft.Json.dll</strong>&nbsp;</h2> <p>Newtonsoft.Json.dll在.net2.0之后的版本可以支持 我的版本.net framework4.0</p> <h3>添加Newtonsoft.json的引用</h3> <p><img src="https://images2018.cnblogs.com/blog/1070330/201803/1070330-20180323094148437-781533868.png" alt=""></p> <h3>对象与json字符串转换类设计</h3> <div><div><span><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span> 1</span> <span>class</span><span> JsonNewtonsoft </span><span> 2</span> <span> { </span><span> 3</span> <span>///</span> <span>&lt;summary&gt;</span> <span> 4</span> <span>///</span><span> 把对象转换为JSON字符串 </span><span> 5</span> <span>///</span> <span>&lt;/summary&gt;</span> <span> 6</span> <span>///</span> <span>&lt;param name="o"&gt;</span><span>对象</span><span>&lt;/param&gt;</span> <span> 7</span> <span>///</span> <span>&lt;returns&gt;</span><span>JSON字符串</span><span>&lt;/returns&gt;</span> <span> 8</span> <span>public</span> <span>static</span> <span>string</span> ToJSON(<span>this</span> <span>object</span><span> o) </span><span> 9</span> <span> { </span><span>10</span> <span>if</span> (o == <span>null</span><span>) </span><span>11</span> <span> { </span><span>12</span> <span>return</span> <span>null</span><span>; </span><span>13</span> <span> } </span><span>14</span> <span>return</span><span> JsonConvert.SerializeObject(o); </span><span>15</span> <span> } </span><span>16</span> <span>///</span> <span>&lt;summary&gt;</span> <span>17</span> <span>///</span><span> 把Json文本转为实体 </span><span>18</span> <span>///</span> <span>&lt;/summary&gt;</span> <span>19</span> <span>///</span> <span>&lt;typeparam name="T"&gt;&lt;/typeparam&gt;</span> <span>20</span> <span>///</span> <span>&lt;param name="input"&gt;&lt;/param&gt;</span> <span>21</span> <span>///</span> <span>&lt;returns&gt;&lt;/returns&gt;</span> <span>22</span> <span>public</span> <span>static</span> T FromJSON&lt;T&gt;(<span>this</span> <span>string</span><span> input) </span><span>23</span> <span> { </span><span>24</span> <span>try</span> <span>25</span> <span> { </span><span>26</span> <span>return</span> JsonConvert.DeserializeObject&lt;T&gt;<span>(input); </span><span>27</span> <span> } </span><span>28</span> <span>catch</span><span> (Exception ex) </span><span>29</span> <span> { </span><span>30</span> <span>return</span> <span>default</span><span>(T); </span><span>31</span> <span> } </span><span>32</span> <span> } </span><span>33</span> }</pre> <div><span><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <h2>方法二:<strong>DataContractJsonSerializer</strong></h2> <p>&nbsp;使用这种 需要引用&nbsp;<strong>System.Runtime.Serialization.dll</strong></p> <h3><strong>类设计</strong></h3> <div><div><span><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span> 1</span> <span>class</span><span> JsonDataContractJsonSerializer </span><span> 2</span> <span> { </span><span> 3</span> <span>///</span> <span>&lt;summary&gt;</span> <span> 4</span> <span>///</span><span> 内存对象转换为json字符串 </span><span> 5</span> <span>///</span> <span>&lt;/summary&gt;</span> <span> 6</span> <span>///</span> <span>&lt;param name="obj"&gt;&lt;/param&gt;</span> <span> 7</span> <span>///</span> <span>&lt;returns&gt;&lt;/returns&gt;</span> <span> 8</span> <span>public</span> <span>static</span> <span>string</span> ObjectToJson(<span>object</span><span> obj) </span><span> 9</span> <span> { </span><span>10</span> DataContractJsonSerializer serializer = <span>new</span><span> DataContractJsonSerializer(obj.GetType()); </span><span>11</span> MemoryStream stream = <span>new</span><span> MemoryStream(); </span><span>12</span> <span> serializer.WriteObject(stream, obj); </span><span>13</span> <span>byte</span>[] dataBytes = <span>new</span> <span>byte</span><span>[stream.Length]; </span><span>14</span> stream.Position = <span>0</span><span>; </span><span>15</span> stream.Read(dataBytes, <span>0</span>, (<span>int</span><span>)stream.Length); </span><span>16</span> <span>return</span><span> Encoding.UTF8.GetString(dataBytes); </span><span>17</span> <span> } </span><span>18</span> <span>///</span> <span>&lt;summary&gt;</span> <span>19</span> <span>///</span><span> Json字符串转内存对象 </span><span>20</span> <span>///</span> <span>&lt;/summary&gt;</span> <span>21</span> <span>///</span> <span>&lt;param name="jsonString"&gt;&lt;/param&gt;</span> <span>22</span> <span>///</span> <span>&lt;param name="obj"&gt;&lt;/param&gt;</span> <span>23</span> <span>///</span> <span>&lt;returns&gt;&lt;/returns&gt;</span> <span>24</span> <span>public</span> <span>static</span> <span>object</span> JsonToObject(<span>string</span> jsonString, <span>object</span><span> obj) </span><span>25</span> <span> { </span><span>26</span> DataContractJsonSerializer serializer = <span>new</span><span> DataContractJsonSerializer(obj.GetType()); </span><span>27</span> MemoryStream mStream = <span>new</span><span> MemoryStream(Encoding.UTF8.GetBytes(jsonString)); </span><span>28</span> <span>return</span><span> serializer.ReadObject(mStream); </span><span>29</span> <span> } </span><span>30</span> }</pre> <div><span><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <h2>方法三:<strong>JavaScriptSerializer</strong></h2> <p><strong>需要引用:System.Web.Extensions.dll</strong></p> <h3><strong>类设计</strong></h3> <div><div><span><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span> 1</span> <span>public</span> <span>static</span> <span>class</span><span> JsonJavaScriptSerializer </span><span> 2</span> <span> { </span><span> 3</span> <span>///</span> <span>&lt;summary&gt;</span> <span> 4</span> <span>///</span><span> 内存对象转换为json字符串 </span><span> 5</span> <span>///</span> <span>&lt;/summary&gt;</span> <span> 6</span> <span>///</span> <span>&lt;param name="obj"&gt;&lt;/param&gt;</span> <span> 7</span> <span>///</span> <span>&lt;returns&gt;&lt;/returns&gt;</span> <span> 8</span> <span>public</span> <span>static</span> <span>string</span> ToJSON(<span>object</span><span> obj) </span><span> 9</span> <span> { </span><span>10</span> StringBuilder sb = <span>new</span><span> StringBuilder(); </span><span>11</span> JavaScriptSerializer json = <span>new</span><span> JavaScriptSerializer(); </span><span>12</span> <span> json.Serialize(obj, sb); </span><span>13</span> <span>return</span><span> sb.ToString(); </span><span>14</span> <span> } </span><span>15</span> <span>///</span> <span>&lt;summary&gt;</span> <span>16</span> <span>///</span><span> Json字符串转内存对象 </span><span>17</span> <span>///</span> <span>&lt;/summary&gt;</span> <span>18</span> <span>///</span> <span>&lt;param name="jsonString"&gt;&lt;/param&gt;</span> <span>19</span> <span>///</span> <span>&lt;param name="obj"&gt;&lt;/param&gt;</span> <span>20</span> <span>///</span> <span>&lt;returns&gt;&lt;/returns&gt;</span> <span>21</span> <span>public</span> <span>static</span> T FromJSON&lt;T&gt;(<span>string</span><span> jsonString) </span><span>22</span> <span> { </span><span>23</span> JavaScriptSerializer json = <span>new</span><span> JavaScriptSerializer(); </span><span>24</span> <span>return</span> json.Deserialize&lt;T&gt;<span>(jsonString); </span><span>25</span> <span> } </span><span>26</span> <span>27</span> }</pre> <div><span><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <h2>程序测试:</h2> <h3>新建一个测试对象类Student.cs</h3> <div><div><span><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span> 1</span> <span>public</span> <span>enum</span><span> Sex </span><span> 2</span> <span> { </span><span> 3</span> 男=<span>0</span><span>, </span><span> 4</span> 女=<span>1</span> <span> 5</span> <span> } </span><span> 6</span> <span> [Serializable()] </span><span> 7</span> <span>class</span><span> Student </span><span> 8</span> <span> { </span><span> 9</span> <span>private</span> <span>string</span><span> _name; </span><span>10</span> <span>11</span> <span>public</span> <span>string</span><span> Name </span><span>12</span> <span> { </span><span>13</span> <span>get</span> { <span>return</span><span> _name; } </span><span>14</span> <span>set</span> { _name =<span> value; } </span><span>15</span> <span> } </span><span>16</span> <span>17</span> <span>private</span> <span>int</span><span> _age; </span><span>18</span> <span>19</span> <span>public</span> <span>int</span><span> Age </span><span>20</span> <span> { </span><span>21</span> <span>get</span> { <span>return</span><span> _age; } </span><span>22</span> <span>set</span> { _age =<span> value; } </span><span>23</span> <span> } </span><span>24</span> <span>25</span> <span>private</span> Sex _sex =<span> Sex.男; </span><span>26</span> <span>27</span> <span>public</span><span> Sex Sex </span><span>28</span> <span> { </span><span>29</span> <span>get</span> { <span>return</span><span> _sex; } </span><span>30</span> <span>set</span> { _sex =<span> value; } </span><span>31</span> <span> } </span><span>32</span> <span>public</span><span> Student() </span><span>33</span> <span> { } </span><span>34</span> <span>public</span> Student(<span>string</span> name,<span>int</span><span> age,Sex sex) </span><span>35</span> <span> { </span><span>36</span> <span>this</span>._name =<span> name; </span><span>37</span> <span>this</span>._age =<span> age; </span><span>38</span> <span>this</span>._sex =<span> sex; </span><span>39</span> <span> } </span><span>40</span> }</pre> <div><span><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <h3>测试程序</h3> <div><div><span><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span> 1</span> <span>static</span> <span>void</span> Main(<span>string</span><span>[] args) </span><span> 2</span> <span> { </span><span> 3</span> Student st = <span>new</span> Student(<span>"</span><span>笨男孩</span><span>"</span>,<span>22</span><span>,Sex.男); </span><span> 4</span> <span> 5</span> Console.WriteLine(<span>"</span><span>============方法一============================================</span><span>"</span><span>); </span><span> 6</span> <span>//</span><span>方法一</span> <span> 7</span> <span> 8</span> Console.WriteLine(<span>"</span><span>方法一对象转Json字符串</span><span>"</span><span>); </span><span> 9</span> <span>string</span> jsonStr =<span> JsonNewtonsoft.ToJSON(st); </span><span>10</span> <span> Console.WriteLine(jsonStr); </span><span>11</span> Console.WriteLine(<span>"</span><span>方法一Json字符串转对象</span><span>"</span><span>); </span><span>12</span> Student stobj = (Student)JsonNewtonsoft.FromJSON&lt;Student&gt;<span>(jsonStr); </span><span>13</span> Console.WriteLine(<span>"</span><span>姓名:{0} 年龄:{1} 性别:{2}</span><span>"</span><span>,stobj.Name,stobj.Age,stobj.Sex); </span><span>14</span> <span>15</span> <span>16</span> Console.WriteLine(<span>"</span><span>============方法二============================================</span><span>"</span><span>); </span><span>17</span> <span>//</span><span>方法二</span> <span>18</span> Console.WriteLine(<span>"</span><span>方法二对象转Json字符串</span><span>"</span><span>); </span><span>19</span> <span>string</span> jsonStr2 =<span> JsonDataContractJsonSerializer.ToJSON(st); </span><span>20</span> <span> Console.WriteLine(jsonStr2); </span><span>21</span> Console.WriteLine(<span>"</span><span>方法二Json字符串转对象</span><span>"</span><span>); </span><span>22</span> Student stobj2 =<span> (Student)JsonDataContractJsonSerializer.FromJSON(jsonStr2, st); </span><span>23</span> Console.WriteLine(<span>"</span><span>姓名:{0} 年龄:{1} 性别:{2}</span><span>"</span><span>, stobj2.Name, stobj2.Age, stobj2.Sex); </span><span>24</span> <span>25</span> <span>26</span> Console.WriteLine(<span>"</span><span>============方法三============================================</span><span>"</span><span>); </span><span>27</span> <span>//</span><span>方法二</span> <span>28</span> Console.WriteLine(<span>"</span><span>方法三对象转Json字符串</span><span>"</span><span>); </span><span>29</span> <span>string</span> jsonStr3 =<span> JsonJavaScriptSerializer.ToJSON(st); </span><span>30</span> <span> Console.WriteLine(jsonStr3); </span><span>31</span> Console.WriteLine(<span>"</span><span>方法三Json字符串转对象</span><span>"</span><span>); </span><span>32</span> Student stobj3 = (Student)JsonJavaScriptSerializer.FromJSON&lt;Student&gt;<span>(jsonStr3); </span><span>33</span> Console.WriteLine(<span>"</span><span>姓名:{0} 年龄:{1} 性别:{2}</span><span>"</span><span>, stobj3.Name, stobj3.Age, stobj3.Sex); </span><span>34</span> <span>35</span> <span> Console.ReadKey(); </span><span>36</span> }</pre> <div><span><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <h3>程序运行结果:</h3> <p><img src="https://images2018.cnblogs.com/blog/1070330/201803/1070330-20180323105742368-1922534797.png" alt=""></p> <p>运行结果:</p> <p><img src="https://images2018.cnblogs.com/blog/1070330/201803/1070330-20180323105607212-438852582.png" alt=""></p> <h2><a href="https://files.cnblogs.com/files/JiYF/ObjectJsonTest.rar" target="_blank"><strong>&nbsp;程序工程源文件下载</strong></a></h2> <h2>功能对比:</h2> <p>&nbsp;<img src="https://images2018.cnblogs.com/blog/1070330/201803/1070330-20180323105422606-1993277357.png" alt=""></p> <h2>性能对比:</h2> <p><img src="https://images2018.cnblogs.com/blog/1070330/201803/1070330-20180323105448804-65071066.png" alt=""></p> <h2>综上所述,一般采用Json.NET方法一比较好!</h2> <p>参考:</p> <p><a href="%20https://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx" target="_blank"><strong>JavaScriptSerializer</strong></a> 类介绍&nbsp;https://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx</p> <p><a href="%20https://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.json.datacontractjsonserializer(v=vs.110).aspx" target="_blank"><strong>DataContractJsonSerializer</strong></a>类介绍&nbsp;https://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.json.datacontractjsonserializer(v=vs.110).aspx</p> <p>https://blog.csdn.net/testcs_dn/article/details/78150046?locationNum=6&amp;fps=1</p> <p>&nbsp;</p></div>

C#中对象与JSON字符串互相转换的三种方式

C#中对象与JSON字符串互相转换的三种方式

JSON(JavaScriptObject Notation, JS 对象标记) 是一种轻量级的数据交换格式。

关于内存对象和JSON字符串的相互转换,在实际项目中应比较广泛,经过一番搜索,找到如下三种方法来解决此问题

分别是使用Newtonsoft.Json.dllDataContractJsonSerializerJavaScriptSerializer

方法一:Newtonsoft.Json.dll

Newtonsoft.Json.dll在.net2.0之后的版本可以支持 我的版本.net framework4.0

添加Newtonsoft.json的引用

对象与json字符串转换类设计

    class JsonNewtonsoft
    {
        /// <summary>
        /// 把对象转换为JSON字符串
        /// </summary>
        /// <param name="o">对象</param>
        /// <returns>JSON字符串</returns>
        public static string ToJSON(this object o)
        {
            if (o == null)
            {
                return null;
            }
            return JsonConvert.SerializeObject(o);
        }
        /// <summary>
        /// 把Json文本转为实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="input"></param>
        /// <returns></returns>
        public static T FromJSON<T>(this string input)
        {
            try
            {
                return JsonConvert.DeserializeObject<T>(input);
            }
            catch (Exception ex)
            {
                return default(T);
            }
        }
    }

方法二:DataContractJsonSerializer

使用这种 需要引用System.Runtime.Serialization.dll

类设计

    class JsonDataContractJsonSerializer
    {
        /// <summary>
        /// 内存对象转换为json字符串
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string ObjectToJson(object obj)
        {
           DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
           MemoryStream stream = new MemoryStream();
           serializer.WriteObject(stream, obj);
           byte[] dataBytes = new byte[stream.Length];
           stream.Position = 0;
           stream.Read(dataBytes, 0, (int)stream.Length);
           return Encoding.UTF8.GetString(dataBytes);
        }
       /// <summary>
       /// Json字符串转内存对象
       /// </summary>
       /// <param name="jsonString"></param>
       /// <param name="obj"></param>
       /// <returns></returns>
        public static object JsonToObject(string jsonString, object obj)
        {
           DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
           MemoryStream mStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
           return serializer.ReadObject(mStream);
        }
    }

方法三:JavaScriptSerializer

需要引用:System.Web.Extensions.dll

类设计

    public static class JsonJavaScriptSerializer
    {
        /// <summary>
        /// 内存对象转换为json字符串
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string ToJSON(object obj)
        {
            StringBuilder sb = new StringBuilder();
            JavaScriptSerializer json = new JavaScriptSerializer();
            json.Serialize(obj, sb);
            return sb.ToString();
        }
        /// <summary>
        /// Json字符串转内存对象
        /// </summary>
        /// <param name="jsonString"></param>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static T FromJSON<T>(string jsonString)
        {
            JavaScriptSerializer json = new JavaScriptSerializer();
            return json.Deserialize<T>(jsonString);
        }

    }

程序测试:

新建一个测试对象类Student.cs

    public enum Sex
    {
        男=0,
        女=1
    }
    [Serializable()]
    class Student
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private int _age;

        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        private Sex _sex = Sex.男;

        public Sex Sex
        {
            get { return _sex; }
            set { _sex = value; }
        }
        public Student()
        { }
        public Student(string name,int age,Sex sex)
        {
            this._name = name;
            this._age = age;
            this._sex = sex;
        }
    }

测试程序

        static void Main(string[] args)
        {
            Student st = new Student("笨男孩",22,Sex.男);

            Console.WriteLine("============方法一============================================");
            //方法一

            Console.WriteLine("方法一对象转Json字符串");
            string jsonStr = JsonNewtonsoft.ToJSON(st);
            Console.WriteLine(jsonStr);
            Console.WriteLine("方法一Json字符串转对象");
            Student stobj = (Student)JsonNewtonsoft.FromJSON<Student>(jsonStr);
            Console.WriteLine("姓名:{0} 年龄:{1} 性别:{2}",stobj.Name,stobj.Age,stobj.Sex);


            Console.WriteLine("============方法二============================================");
            //方法二
            Console.WriteLine("方法二对象转Json字符串");
            string jsonStr2 = JsonDataContractJsonSerializer.ToJSON(st);
            Console.WriteLine(jsonStr2);
            Console.WriteLine("方法二Json字符串转对象");
            Student stobj2 = (Student)JsonDataContractJsonSerializer.FromJSON(jsonStr2, st);
            Console.WriteLine("姓名:{0} 年龄:{1} 性别:{2}", stobj2.Name, stobj2.Age, stobj2.Sex);


            Console.WriteLine("============方法三============================================");
            //方法二
            Console.WriteLine("方法三对象转Json字符串");
            string jsonStr3 = JsonJavaScriptSerializer.ToJSON(st);
            Console.WriteLine(jsonStr3);
            Console.WriteLine("方法三Json字符串转对象");
            Student stobj3 = (Student)JsonJavaScriptSerializer.FromJSON<Student>(jsonStr3);
            Console.WriteLine("姓名:{0} 年龄:{1} 性别:{2}", stobj3.Name, stobj3.Age, stobj3.Sex);

            Console.ReadKey();
        }

程序运行结果:

运行结果:

性能对比:

综上所述,一般采用Json.NET方法一比较好!

参考:

JavaScriptSerializer类介绍:https://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx

DataContractJsonSerializer类介绍:https://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.json.datacontractjsonserializer(v=vs.110).aspx

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接

您可能感兴趣的文章:
  • C#实现JSON和对象之间互相转换功能示例
  • C#编程实现对象与JSON串互相转换实例分析
  • C#实现json格式转换成对象并更换key的方法
  • C#中的DataSet、string、DataTable、对象转换成Json的实现代码

jackson java对象和json对象的互相转换

jackson java对象和json对象的互相转换

概述

Jackson框架是基于Java平台的一套数据处理工具,被称为“最好的Java Json解析器”。 
Jackson框架包含了3个核心库:streaming,databind,annotations.Jackson还包含了其它数据处理类库,此外不作说明。
Jackson版本: 1.x (目前版本从1.1~1.9)与2.x。1.x与2.x从包的命名上可以看出来,1.x的类库中,包命名以:org.codehaus.jackson.xxx开头,而2.x类库中包命令:com.fastxml.jackson.xxx开头

Jackson Home Page:https://github.com/FasterXML/jackson
Jackson Wiki:http://wiki.fasterxml.com/JacksonHome
Jackson doc: https://github.com/FasterXML/jackson-docs
Jackson Download Page:http://wiki.fasterxml.com/JacksonDownload

 

准备工作

本文所有程序都基于JDK1.7,依赖jackon的三个核心类库:
jackson-core-2.5.3.jar
jackson-annotations-2.5.3.jar
jackson-databind-2.5.3.jar

 

Jackson处理Json

Jackson提供了三种可选的Json处理方法:流式API(Streaming API) 、树模型(Tree Model)、数据绑定(Data Binding)。从使用角度来看,比较一下这三种处理Json的方式的特性:

Streaming API:是效率最高的处理方式(开销低、读写速度快,但程序编写复杂度高)
Tree Model:是最灵活的处理方式
Data Binding:是最常用的处理方式

下面我们通过例子程序分别使用DataBinding,TreeModel,Streaming的方式来创建和解析Json字符串

 

1.DataBinding处理Json

Jackson支持Java对象与Json之间的相互转化。java对象序列化为json字符串,json字符串也可以反序列化为相同的java对象。
 
(1)java对象转化成json:
Province.java
[java]  view plain  copy
 
  1. package com.jackson.json.databinding;  
  2.   
  3. public class Province {  
  4.     public String name;  
  5.     public int population;  
  6.     public String[] city;     
  7. }  
Country.java
[java]  view plain  copy
 
  1. package com.jackson.json.databinding;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Arrays;  
  5. import java.util.Date;  
  6. import java.util.HashMap;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9.   
  10. public class Country {  
  11.     // 注意:被序列化的bean的private属性字段需要创建getter方法或者属性字段应该为public  
  12.     private String country_id;  
  13.     private Date birthDate;  
  14.     private List<String> nation = new ArrayList<String>();  
  15.     private String[] lakes;  
  16.     private List<Province> provinces = new ArrayList<Province>();  
  17.     private Map<String, Integer> traffic = new HashMap<String, Integer>();  
  18.   
  19.     public Country() {  
  20.         // TODO Auto-generated constructor stub  
  21.     }  
  22.   
  23.     public Country(String countryId) {  
  24.         this.country_id = countryId;  
  25.     }  
  26.   
  27.     public String getCountry_id() {  
  28.         return country_id;  
  29.     }  
  30.   
  31.     public void setCountry_id(String country_id) {  
  32.         this.country_id = country_id;  
  33.     }  
  34.   
  35.     public Date getBirthDate() {  
  36.         return birthDate;  
  37.     }  
  38.   
  39.     public void setBirthDate(Date birthDate) {  
  40.         this.birthDate = birthDate;  
  41.     }  
  42.   
  43.     public List<String> getNation() {  
  44.         return nation;  
  45.     }  
  46.   
  47.     public void setNation(List<String> nation) {  
  48.         this.nation = nation;  
  49.     }  
  50.   
  51.     public String[] getLakes() {  
  52.         return lakes;  
  53.     }  
  54.   
  55.     public void setLakes(String[] lakes) {  
  56.         this.lakes = lakes;  
  57.     }  
  58.   
  59.     public Integer get(String key) {  
  60.         return traffic.get(key);  
  61.     }  
  62.   
  63.     public Map<String, Integer> getTraffic() {  
  64.         return traffic;  
  65.     }  
  66.   
  67.     public void setTraffic(Map<String, Integer> traffic) {  
  68.         this.traffic = traffic;  
  69.     }  
  70.   
  71.     public void addTraffic(String key, Integer value) {  
  72.         traffic.put(key, value);  
  73.     }  
  74.   
  75.     public List<Province> getProvinces() {  
  76.         return provinces;  
  77.     }  
  78.   
  79.     public void setProvinces(List<Province> provinces) {  
  80.         this.provinces = provinces;  
  81.     }  
  82.   
  83.     @Override  
  84.     public String toString() {  
  85.         return "Country [country_id=" + country_id + ", birthDate=" + birthDate  
  86.                 + ", nation=" + nation + ", lakes=" + Arrays.toString(lakes)  
  87.                 + ", province=" + provinces + ", traffic=" + traffic + "]";  
  88.     }  
  89.   
  90. }  
JavaBeanSerializeToJson.java
[java]  view plain  copy
 
  1. package com.jackson.json.databinding;  
  2.   
  3. import java.io.File;  
  4. import java.text.SimpleDateFormat;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import com.fasterxml.jackson.annotation.JsonInclude.Include;  
  9. import com.fasterxml.jackson.databind.ObjectMapper;  
  10. import com.fasterxml.jackson.databind.SerializationFeature;  
  11.   
  12. public class JavaBeanSerializeToJson {  
  13.   
  14.     public static void convert() throws Exception {  
  15.         // 使用ObjectMapper来转化对象为Json  
  16.         ObjectMapper mapper = new ObjectMapper();  
  17.         // 添加功能,让时间格式更具有可读性  
  18.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
  19.         mapper.setDateFormat(dateFormat);  
  20.   
  21.         Country country = new Country("China");  
  22.         country.setBirthDate(dateFormat.parse("1949-10-01"));  
  23.         country.setLakes(new String[] { "Qinghai Lake", "Poyang Lake",  
  24.                 "Dongting Lake", "Taihu Lake" });  
  25.   
  26.         List<String> nation = new ArrayList<String>();  
  27.         nation.add("Han");  
  28.         nation.add("Meng");  
  29.         nation.add("Hui");  
  30.         nation.add("WeiWuEr");  
  31.         nation.add("Zang");  
  32.         country.setNation(nation);  
  33.   
  34.         Province province = new Province();  
  35.         province.name = "Shanxi";  
  36.         province.population = 37751200;  
  37.         Province province2 = new Province();  
  38.         province2.name = "ZheJiang";  
  39.         province2.population = 55080000;  
  40.         List<Province> provinces = new ArrayList<Province>();  
  41.         provinces.add(province);  
  42.         provinces.add(province2);  
  43.         country.setProvinces(provinces);  
  44.           
  45.         country.addTraffic("Train(KM)", 112000);  
  46.         country.addTraffic("HighWay(KM)", 4240000);  
  47.         // 为了使JSON视觉上的可读性,增加一行如下代码,注意,在生产中不需要这样,因为这样会增大Json的内容  
  48.         mapper.configure(SerializationFeature.INDENT_OUTPUT, true);  
  49.         // 配置mapper忽略空属性  
  50.         mapper.setSerializationInclusion(Include.NON_EMPTY);  
  51.         // 默认情况,Jackson使用Java属性字段名称作为 Json的属性名称,也可以使用Jackson annotations(注解)改变Json属性名称  
  52.         mapper.writeValue(new File("country.json"), country);  
  53.     }  
  54.   
  55.     public static void main(String[] args) throws Exception {  
  56.         convert();  
  57.     }  
  58.   
  59. }  
程序运行后生成country.json,内容如下:
[html]  view plain  copy
 
  1. {  
  2.   "country_id" : "China",  
  3.   "birthDate" : "1949-10-01",  
  4.   "nation" : [ "Han", "Meng", "Hui", "WeiWuEr", "Zang" ],  
  5.   "lakes" : [ "Qinghai Lake", "Poyang Lake", "Dongting Lake", "Taihu Lake" ],  
  6.   "provinces" : [ {  
  7.     "name" : "Shanxi",  
  8.     "population" : 37751200  
  9.   }, {  
  10.     "name" : "ZheJiang",  
  11.     "population" : 55080000  
  12.   } ],  
  13.   "traffic" : {  
  14.     "HighWay(KM)" : 4240000,  
  15.     "Train(KM)" : 112000  
  16.   }  
  17. }  
 
(2)Json字符串反序列化为java对象:
[java]  view plain  copy
 
  1. package com.jackson.json.databinding;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.text.SimpleDateFormat;  
  6. import java.util.Iterator;  
  7. import java.util.List;  
  8.   
  9. import com.fasterxml.jackson.core.JsonParseException;  
  10. import com.fasterxml.jackson.databind.DeserializationFeature;  
  11. import com.fasterxml.jackson.databind.JsonMappingException;  
  12. import com.fasterxml.jackson.databind.ObjectMapper;  
  13.   
  14. /** 
  15.  * 将Json字符串反序列化为Java对象 
  16.  */  
  17. public class JsonDeserializeToJava {  
  18.       
  19.     public static void main(String[] args) throws Exception {  
  20.         //ObjectMapper类用序列化与反序列化映射器  
  21.         ObjectMapper mapper = new ObjectMapper();  
  22.         File json = new File("country.json");  
  23.         //当反序列化json时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,  
  24.         //因为,例如json里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略  
  25.         mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);  
  26.           
  27.         //从json映射到java对象,得到country对象后就可以遍历查找,下面遍历部分内容,能说明问题就可以了  
  28.         Country country = mapper.readValue(json, Country.class);  
  29.         System.out.println("country_id:"+country.getCountry_id());  
  30.         //设置时间格式,便于阅读  
  31.         SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");  
  32.         String birthDate = dateformat.format(country.getBirthDate());  
  33.         System.out.println("birthDate:"+birthDate);  
  34.           
  35.         List<Province> provinces = country.getProvinces();  
  36.         for (Province province : provinces) {  
  37.             System.out.println("province:"+province.name + "\n" + "population:"+province.population);  
  38.         }  
  39.     }  
  40. }  
程序运行结果:
[html]  view plain  copy
 
  1. country_id:China  
  2. birthDate:1949-10-01  
  3. province:Shanxi  
  4. population:37751200  
  5. province:ZheJiang  
  6. population:55080000  
 

2.Tree Model处理Json

(1)tree model生成json:

[java]  view plain  copy
 
  1. package com.jackson.json.treemodel;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileWriter;  
  5.   
  6. import com.fasterxml.jackson.core.JsonFactory;  
  7. import com.fasterxml.jackson.core.JsonGenerator;  
  8. import com.fasterxml.jackson.databind.ObjectMapper;  
  9. import com.fasterxml.jackson.databind.SerializationFeature;  
  10. import com.fasterxml.jackson.databind.node.ArrayNode;  
  11. import com.fasterxml.jackson.databind.node.JsonNodeFactory;  
  12. import com.fasterxml.jackson.databind.node.ObjectNode;  
  13.   
  14. public class SerializationExampleTreeModel {  
  15.       
  16.     public static void main(String[] args) throws Exception {  
  17.         //创建一个节点工厂,为我们提供所有节点  
  18.         JsonNodeFactory factory = new JsonNodeFactory(false);  
  19.         //创建一个json factory来写tree modle为json  
  20.         JsonFactory jsonFactory = new JsonFactory();  
  21.         //创建一个json生成器  
  22.         JsonGenerator generator = jsonFactory.createGenerator(new FileWriter(new File("country2.json")));  
  23.         //注意,默认情况下对象映射器不会指定根节点,下面设根节点为country  
  24.         ObjectMapper mapper = new ObjectMapper();  
  25.         ObjectNode country = factory.objectNode();  
  26.           
  27.         country.put("country_id", "China");  
  28.         country.put("birthDate", "1949-10-01");  
  29.           
  30.         //在Java中,List和Array转化为json后对应的格式符号都是"obj:[]"  
  31.         ArrayNode nation = factory.arrayNode();  
  32.         nation.add("Han").add("Meng").add("Hui").add("WeiWuEr").add("Zang");  
  33.         country.set("nation", nation);  
  34.           
  35.         ArrayNode lakes = factory.arrayNode();  
  36.         lakes.add("QingHai Lake").add("Poyang Lake").add("Dongting Lake").add("Taihu Lake");  
  37.         country.set("lakes", lakes);  
  38.           
  39.         ArrayNode provinces = factory.arrayNode();  
  40.         ObjectNode province = factory.objectNode();  
  41.         ObjectNode province2 = factory.objectNode();  
  42.         province.put("name","Shanxi");  
  43.         province.put("population", 37751200);  
  44.         province2.put("name","ZheJiang");  
  45.         province2.put("population", 55080000);  
  46.         provinces.add(province).add(province2);  
  47.         country.set("provinces", provinces);  
  48.           
  49.         ObjectNode traffic = factory.objectNode();  
  50.         traffic.put("HighWay(KM)", 4240000);  
  51.         traffic.put("Train(KM)", 112000);  
  52.         country.set("traffic", traffic);  
  53.           
  54.         mapper.configure(SerializationFeature.INDENT_OUTPUT, true);  
  55.         mapper.writeTree(generator, country);  
  56.     }  
  57.   
  58. }  

程序运行生成country2.json,内容如下:

[html]  view plain  copy
 
  1. {"country_id":"China","birthDate":"1949-10-01","nation":["Han","Meng","Hui","WeiWuEr","Zang"],"lakes":["QingHai Lake","Poyang Lake","Dongting Lake","Taihu Lake"],"provinces":[{"name":"Shanxi","population":37751200},{"name":"ZheJiang","population":55080000}],"traffic":{"HighWay(KM)":4240000,"Train(KM)":112000}}  

 

 

(2) json字符串反序列化为tree mode

DeserializationExampleTreeModel1.java,请注意观察程序中不同的JsonNode的类型变化

[java]  view plain  copy
 
  1. package com.jackson.json.treemodel;  
  2.   
  3. import java.io.File;  
  4. import java.util.Iterator;  
  5.   
  6. import com.fasterxml.jackson.databind.JsonNode;  
  7. import com.fasterxml.jackson.databind.ObjectMapper;  
  8.   
  9. public class DeserializationExampleTreeModel1 {  
  10.   
  11.     public static void main(String[] args) throws Exception {  
  12.         ObjectMapper mapper = new ObjectMapper();  
  13.         // Jackson提供一个树节点被称为"JsonNode",ObjectMapper提供方法来读json作为树的JsonNode根节点  
  14.         JsonNode node = mapper.readTree(new File("country2.json"));  
  15.         // 看看根节点的类型  
  16.         System.out.println("node JsonNodeType:"+node.getNodeType());  
  17.         // 是不是一个容器  
  18.         System.out.println("node is container Node ? "+node.isContainerNode());  
  19.         // 得到所有node节点的子节点名称  
  20.         System.out.println("---------得到所有node节点的子节点名称-------------------------");  
  21.         Iterator<String> fieldNames = node.fieldNames();  
  22.         while (fieldNames.hasNext()) {  
  23.             String fieldName = fieldNames.next();  
  24.             System.out.print(fieldName+" ");  
  25.         }  
  26.         System.out.println("\n-----------------------------------------------------");  
  27.         // as.Text的作用是有值返回值,无值返回空字符串  
  28.         JsonNode country_id = node.get("country_id");  
  29.         System.out.println("country_id:"+country_id.asText() + " JsonNodeType:"+country_id.getNodeType());  
  30.           
  31.         JsonNode birthDate = node.get("birthDate");  
  32.         System.out.println("birthDate:"+birthDate.asText()+" JsonNodeType:"+birthDate.getNodeType());  
  33.           
  34.         JsonNode nation = node.get("nation");  
  35.         System.out.println("nation:"+ nation+ " JsonNodeType:"+nation.getNodeType());  
  36.           
  37.         JsonNode lakes = node.get("lakes");  
  38.         System.out.println("lakes:"+lakes+" JsonNodeType:"+lakes.getNodeType());  
  39.   
  40.         JsonNode provinces = node.get("provinces");  
  41.         System.out.println("provinces JsonNodeType:"+provinces.getNodeType());  
  42.   
  43.         boolean flag = true;  
  44.         for (JsonNode provinceElements : provinces) {  
  45.             //为了避免provinceElements多次打印,用flag控制打印,能体现provinceElements的JsonNodeType就可以了  
  46.             if(flag){  
  47.                 System.out.println("provinceElements JsonNodeType:"+provinceElements.getNodeType());  
  48.                 System.out.println("provinceElements is container node? "+provinceElements.isContainerNode());  
  49.                 flag = false;  
  50.             }  
  51.             Iterator<String> provinceElementFields = provinceElements.fieldNames();  
  52.             while (provinceElementFields.hasNext()) {  
  53.                 String fieldName = (String) provinceElementFields.next();  
  54.                 String province;  
  55.                 if ("population".equals(fieldName)) {  
  56.                     province = fieldName + ":" + provinceElements.get(fieldName).asInt();  
  57.                 }else{  
  58.                     province = fieldName + ":" + provinceElements.get(fieldName).asText();  
  59.                 }  
  60.                 System.out.println(province);  
  61.             }  
  62.         }  
  63.     }  
  64. }  

 

程序运行后打印结果如下:

[html]  view plain  copy
 
  1. node JsonNodeType:OBJECT  
  2. node is container Node ? true  
  3. ---------得到所有node节点的子节点名称-------------------------  
  4. country_id birthDate nation lakes provinces traffic   
  5. -----------------------------------------------------  
  6. country_id:China JsonNodeType:STRING  
  7. birthDate:1949-10-01 JsonNodeType:STRING  
  8. nation:["Han","Meng","Hui","WeiWuEr","Zang"] JsonNodeType:ARRAY  
  9. lakes:["QingHai Lake","Poyang Lake","Dongting Lake","Taihu Lake"] JsonNodeType:ARRAY  
  10. provinces JsonNodeType:ARRAY  
  11. provinceElements JsonNodeType:OBJECT  
  12. provinceElements is container node? true  
  13. name:Shanxi  
  14. population:37751200  
  15. name:ZheJiang  
  16. population:55080000  

 

在来看一下DeserializationExampleTreeModel2.java,本例中使用JsonNode.path的方法,path方法类似于DeserializationExampleTreeModel1.java中使用的get方法,

但当node不存在时,get方法返回null,而path返回MISSING类型的JsonNode

[java]  view plain  copy
 
  1. package com.jackson.json.treemodel;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.util.Iterator;  
  6.   
  7. import com.fasterxml.jackson.core.JsonProcessingException;  
  8. import com.fasterxml.jackson.databind.JsonNode;  
  9. import com.fasterxml.jackson.databind.ObjectMapper;  
  10.   
  11. public class DeserializationExampleTreeModle2 {  
  12.       
  13.     public static void main(String[] args) throws JsonProcessingException, IOException{  
  14.         ObjectMapper mapper = new ObjectMapper();  
  15.         JsonNode node = mapper.readTree(new File("country2.json"));  
  16.         //path方法获取JsonNode时,当对象不存在时,返回MISSING类型的JsonNode  
  17.         JsonNode missingNode = node.path("test");  
  18.         if(missingNode.isMissingNode()){  
  19.             System.out.println("JsonNodeType : " + missingNode.getNodeType());  
  20.         }  
  21.   
  22.         System.out.println("country_id:"+node.path("country_id").asText());  
  23.           
  24.         JsonNode provinces = node.path("provinces");  
  25.         for (JsonNode provinceElements : provinces) {  
  26.             Iterator<String> provincesFields = provinceElements.fieldNames();  
  27.             while (provincesFields.hasNext()) {  
  28.                 String fieldName = (String) provincesFields.next();  
  29.                 String province;  
  30.                 if("name".equals(fieldName)){  
  31.                     province = fieldName +":"+ provinceElements.path(fieldName).asText();  
  32.                 }else{  
  33.                     province = fieldName +":"+ provinceElements.path(fieldName).asInt();  
  34.                 }  
  35.                 System.out.println(province);  
  36.             }  
  37.         }  
  38.     }  
  39.   
  40. }  

程序运行打印结果:

[html]  view plain  copy
 
  1. JsonNodeType : MISSING  
  2. country_id:China  
  3. name:Shanxi  
  4. population:37751200  
  5. name:ZheJiang  
  6. population:55080000  

 

3.Stream处理Json

(1)stream生成json

 

[java]  view plain  copy
 
  1. package com.jackson.json.streaming;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileWriter;  
  5. import java.io.Exception;  
  6.   
  7. import com.fasterxml.jackson.core.JsonFactory;  
  8. import com.fasterxml.jackson.core.JsonGenerator;  
  9.   
  10. public class StreamGeneratorJson {  
  11.       
  12.     public static void main(String[] args) throws Exception {  
  13.         JsonFactory factory = new JsonFactory();  
  14.         //从JsonFactory创建一个JsonGenerator生成器的实例  
  15.         JsonGenerator generator = factory.createGenerator(new FileWriter(new File("country3.json")));  
  16.           
  17.         generator.writeStartObject();  
  18.         generator.writeFieldName("country_id");  
  19.         generator.writeString("China");  
  20.         generator.writeFieldName("provinces");  
  21.         generator.writeStartArray();  
  22.         generator.writeStartObject();  
  23.         generator.writeStringField("name", "Shanxi");  
  24.         generator.writeNumberField("population", 33750000);  
  25.         generator.writeEndObject();  
  26.         generator.writeEndArray();  
  27.         generator.writeEndObject();  
  28.           
  29.         generator.close();  
  30.     }  
  31.   
  32. }  
程序运行后生成country3.json文件内容:
[html]  view plain  copy
 
  1. {"country_id":"China","provinces":[{"name":"Shanxi","population":33750000}]}  
 
(2)stream解析json:
现在adgcountry3.json,我们用Streaming API的方式来解析上面的Json,并查找json中population的值。
[java]  view plain  copy
 
  1. package com.jackson.json.streaming;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5.   
  6. import com.fasterxml.jackson.core.JsonFactory;  
  7. import com.fasterxml.jackson.core.JsonParseException;  
  8. import com.fasterxml.jackson.core.JsonParser;  
  9. import com.fasterxml.jackson.core.JsonToken;  
  10.   
  11. /*Jackson API提供了token对每个Json对象,例如,Json开始符号“{”是token指向的第一个解析的对象, 
  12.  key:value键值对是另一个单独的对象。这个API很强大,但也需要编写大量代码。不推荐使用,平时更多的是使用DataBinding和TreeModel来处理json 
  13.  */  
  14. public class StreamParserJson {  
  15.     public static void main(String[] args) throws JsonParseException,  
  16.             IOException {  
  17.         JsonFactory factory = new JsonFactory();  
  18.         // 从JsonFactory创建JsonParser解析器的实例  
  19.         JsonParser parser = factory.createParser(new File("country3.json"));  
  20.   
  21.         while (!parser.isClosed()) {  
  22.             // 得到一个token,第一次遍历时,token指向json文件中第一个符号"{"  
  23.             JsonToken token = parser.nextToken();  
  24.             if (token == null) {  
  25.                 break;  
  26.             }  
  27.             // 我们只查找 country3.json中的"population"字段的值,能体现解析的流程就可以了  
  28.             // 当key是provinces时,我们进入provinces,查找population  
  29.             if (JsonToken.FIELD_NAME.equals(token)  
  30.                     && "provinces".equals(parser.getCurrentName())) {  
  31.                 token = parser.nextToken();  
  32.                 if (!JsonToken.START_ARRAY.equals(token)) {  
  33.                     break;  
  34.                 }  
  35.                 // 此时,token指向的应该是"{"  
  36.                 token = parser.nextToken();  
  37.                 if (!JsonToken.START_OBJECT.equals(token)) {  
  38.                     break;  
  39.                 }  
  40.                 while (true) {  
  41.                     token = parser.nextToken();  
  42.                     if (token == null) {  
  43.                         break;  
  44.                     }  
  45.                     if (JsonToken.FIELD_NAME.equals(token)  
  46.                             && "population".equals(parser.getCurrentName())) {  
  47.                         token = parser.nextToken();  
  48.                         System.out.println(parser.getCurrentName() + " : "  
  49.                                 + parser.getIntValue());  
  50.                     }  
  51.                 }  
  52.             }  
  53.         }  
  54.     }  
  55.   
  56. }  
程序运行后,在控制台打印结果如下:
[html]  view plain  copy
 
  1. population : 33750000  

总结

上面的例子中,分别用3种方式处理Json,我的体会大致如下:
 
Stream API方式是开销最低、效率最高,但编写代码复杂度也最高,在生成Json时,需要逐步编写符号和字段拼接json,在解析Json时,需要根据token指向也查找json值,生成和解析json都不是很方便,代码可读性也很低。
Databinding处理Json是最常用的json处理方式,生成json时,创建相关的java对象,并根据json内容结构把java对象组装起来,最后调用writeValue方法即可生成json,
解析时,就更简单了,直接把json映射到相关的java对象,然后就可以遍历java对象来获取值了。
TreeModel处理Json,是以树型结构来生成和解析json,生成json时,根据json内容结构,我们创建不同类型的节点对象,组装这些节点生成json。解析json时,它不需要绑定json到java bean,根据json结构,使用path或get方法轻松查找内容。

今天关于C#将集合和Json格式互相转换的几种方式c# 集合转字符串的分享就到这里,希望大家有所收获,若想了解更多关于ABAP和XML数据格式互相转换的两种方式、C# 对象与JSON字符串互相转换的三种方式、C#中对象与JSON字符串互相转换的三种方式、jackson java对象和json对象的互相转换等相关知识,可以在本站进行查询。

本文标签: