您的位置:首页 > Web前端 > JavaScript

新时尚Windows8开发(32):Json数据处理(A)

2013-01-16 10:13 411 查看
SON是啥?大家不陌生了吧,估计有人比我还懂,这玩意儿其实我只懂点皮毛,对,就是皮毛,皮和毛,皮包着毛,你看看JSON对象是不是这样?

外面套着一对大括号({})是皮,里面有很多毛毛,其实一个JSON对象就好像一个字典集合,有key,也有value,当然,也可以没有key。你看,一个标准的JSON对象大概是这样的。

{

      '键名' : 键值,

      '键名' :  键值,

      '键名' : 键值

}

 

如果是集合,如数组之类的,就多个对象放在 [ ...] 中,用逗号隔开,记得是英文的逗号。

 

 


案例1:从JSON字符串产生JSON对象

这个例子,我们来“调研”一下,如何从一个JSON结构的字符串生成一个JSON对象。

1、新建一个空白页面的“板砖”风格应用。

2、主页的布局就直接Ctrl + V XAML代码了,不然又有人说:“这和Win8有毛关系啊,这不是WPF中的XAML吗?”

[html] view
plaincopyprint?

<Page  

    x:Class="App3.MainPage"  

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  

    xmlns:local="using:App3"  

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  

    mc:Ignorable="d">  

      

    <Page.Resources>  

        <Style x:Key="tbstyle" TargetType="TextBlock">  

            <Setter Property="FontSize" Value="25"/>  

        </Style>  

    </Page.Resources>  

  

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">  

        <StackPanel Margin="20">  

            <Button Content="从JSON字符串生成对象" Click="onClick"/>  

            <Grid Margin="5,19,6,0">  

                <Grid.RowDefinitions>  

                    <RowDefinition Height="auto"/>  

                    <RowDefinition Height="auto"/>  

                    <RowDefinition Height="auto"/>  

                    <RowDefinition Height="auto"/>  

                </Grid.RowDefinitions>  

                <Grid.ColumnDefinitions>  

                    <ColumnDefinition Width="auto"/>  

                    <ColumnDefinition Width="auto"/>  

                </Grid.ColumnDefinitions>  

                <TextBlock Grid.Row="0" Grid.Column="0" Text="编号:" Style="{StaticResource tbstyle}"/>  

                <TextBlock x:Name="tbNO" Grid.Column="1" Grid.Row="0" Style="{StaticResource tbstyle}"/>  

                <TextBlock Grid.Column="0" Grid.Row="1" Text="姓名:" Style="{StaticResource tbstyle}"/>  

                <TextBlock x:Name="tbName" Grid.Row="1" Grid.Column="1" Style="{StaticResource tbstyle}"/>  

                <TextBlock Grid.Column="0" Grid.Row="2" Text="城市:" Style="{StaticResource tbstyle}"/>  

                <TextBlock x:Name="tbCity" Grid.Row="2" Grid.Column="1" Style="{StaticResource tbstyle}"/>  

                <TextBlock Grid.Row="3" Grid.Column="0" Text="年龄:" Style="{StaticResource tbstyle}"/>  

                <TextBlock x:Name="tbAge" Grid.Row="3" Grid.Column="1" Style="{StaticResource tbstyle}"/>  

            </Grid>  

        </StackPanel>  

    </Grid>  

</Page>  

 

3、后台的代码,主要是处理按钮的Click事件,我贴个完整的。

[csharp] view
plaincopyprint?

using System;  

using System.Collections.Generic;  

using System.IO;  

using System.Linq;  

using Windows.Foundation;  

using Windows.Foundation.Collections;  

using Windows.UI.Xaml;  

using Windows.UI.Xaml.Controls;  

using Windows.UI.Xaml.Controls.Primitives;  

using Windows.UI.Xaml.Data;  

using Windows.UI.Xaml.Input;  

using Windows.UI.Xaml.Media;  

using Windows.UI.Xaml.Navigation;  

using Windows.Data.Json;  

  

namespace App3  

{  

    /// <summary>  

    /// 可用于自身或导航至 Frame 内部的空白页。  

    /// </summary>  

    public sealed partial class MainPage : Page  

    {  

        public MainPage()  

        {  

            this.InitializeComponent();  

        }  

  

  

        private void onClick(object sender, RoutedEventArgs e)  

        {  

            // JSON字符串  

            string jsonString = "{" +  

                                    "\"No\":\"000-2145\"," +  

                                    "\"Name\":\"小王\"," +  

                                    "\"City\":\"天津\"," +  

                                    "\"Age\":185" +  

                                "}";  

            // 生成JSON对象  

            JsonObject obj = JsonObject.Parse(jsonString);  

            // 从JSON对象中取出数据  

            this.tbNO.Text = obj.GetNamedString("No");  

            this.tbName.Text = obj.GetNamedString("Name");  

            this.tbCity.Text = obj.GetNamedString("City");  

            this.tbAge.Text = obj.GetNamedNumber("Age").ToString();  

        }  

    }  

}  

从代码中,你会看到,要处理与JSON有关的数据,先引入Windows.Data.Json命名空间。

因为我们的JSON对象是带命名键的,所以,在生成JsonObject后,可以通过调用以下方法来取得对应字段的值:

【对JSON来说,无非就是字符串,布尔类型,数值,数组或者复合对象】

GetNamedArray —— 如果对应字段是一个JSON对象数组,就可以考虎调用该方法。

GetNamedBoolean,GetNamedNumber,GetNamedString,GetNamedObject —— 这些方法就简单了,都是取出单个指定类型的值。

现在运行一下,点击页面最上方的按钮,就会看到结果了。



 

 


案例2:将JSON对象转换为字符串

本个例子貌似和上面的例子相反,是将JSON对象变成字符串表示形式。

1、新建应用程序项目。

2、MainPage.xaml的UI如下:

[html] view
plaincopyprint?

<Page  

    x:Class="App1.MainPage"  

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  

    xmlns:local="using:App1"  

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  

    mc:Ignorable="d">  

  

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">  

        <StackPanel Margin="20">  

            <Button Content="生成JSON字符串" Click="onClick"/>  

            <TextBox x:Name="txtJson" Margin="8,17,8,0" Height="400" TextWrapping="Wrap" FontSize="20"/>  

        </StackPanel>  

    </Grid>  

</Page>  

单击按钮后,生成JSON对象,并在下面的TextBox中显示转换的字符串。

 

3、处理按钮的Click事件。记得引入Windows.Data.Json命名空间。

[csharp] view
plaincopyprint?

private void onClick(object sender, RoutedEventArgs e)  

{  

    // 创建第一团队的成员对象  

    JsonObject menb1 = new JsonObject();  

    menb1.SetNamedValue("姓名", JsonValue.CreateStringValue("老刘"));  

    menb1.SetNamedValue("人品指数", JsonValue.CreateNumberValue(250));  

    menb1.SetNamedValue("是否砖家", JsonValue.CreateBooleanValue(true));  

    JsonObject menb2 = new JsonObject();  

    menb2.SetNamedValue("姓名", JsonValue.CreateStringValue("老赵"));  

    menb2.SetNamedValue("人品指数", JsonValue.CreateNumberValue(97));  

    menb2.SetNamedValue("是否砖家", JsonValue.CreateBooleanValue(false));  

    JsonArray arr1 = new JsonArray();  

    arr1.Add(menb1);  

    arr1.Add(menb2);  

    // 第一团队信息  

    JsonObject teamA = new JsonObject();  

    teamA.SetNamedValue("团队名称", JsonValue.CreateStringValue("牛B一队"));  

    teamA.SetNamedValue("成员列表", arr1);  

    // ------------------------------------------------------------------------------  

    // 第二团队的成员  

    JsonObject menbB1 = new JsonObject();  

    menbB1.SetNamedValue("姓名", JsonValue.CreateStringValue("小黄"));  

    menbB1.SetNamedValue("人品指数", JsonValue.CreateNumberValue(108));  

    menbB1.SetNamedValue("是否砖家", JsonValue.CreateBooleanValue(false));  

    JsonObject menbB2 = new JsonObject();  

    menbB2.SetNamedValue("姓名", JsonValue.CreateStringValue("小龙"));  

    menbB2.SetNamedValue("人品指数", JsonValue.CreateNumberValue(392));  

    menbB2.SetNamedValue("是否砖家", JsonValue.CreateBooleanValue(true));  

    JsonObject menbB3 = new JsonObject();  

    menbB3.SetNamedValue("姓名", JsonValue.CreateStringValue("老袁"));  

    menbB3.SetNamedValue("人品指数", JsonValue.CreateNumberValue(65));  

    menbB3.SetNamedValue("是否砖家", JsonValue.CreateBooleanValue(false));  

    JsonArray arr2 = new JsonArray();  

    arr2.Add(menbB1);  

    arr2.Add(menbB2);  

    arr2.Add(menbB3);  

    // 第二团队信息  

    JsonObject teamB = new JsonObject();  

    teamB.SetNamedValue("团队名称", JsonValue.CreateStringValue("牛B二队"));  

    teamB.SetNamedValue("成员列表", arr2);  

  

    // 将两个团队的信息放到一个数组中  

    JsonArray teams = new JsonArray();  

    teams.Add(teamA);  

    teams.Add(teamB);  

  

    // 将以上JSON对象转换为字符串  

    this.txtJson.Text = teams.Stringify();  

}  

上面代码演示两个牛B团队的基本信息,而每个团队中又包含各自的成员信息。

结果就像下图所示:



 

是不是觉得这种生成JSON的方法有些复杂有点痛苦呢? 勿急,下一篇博文,我们将玩一些简单的东东。

转载:http://blog.csdn.net/tcjiaan/article/details/8181482
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: