现在的位置: 首页 > 综合 > 正文

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

2012年03月17日 ⁄ 综合 ⁄ 共 5812字 ⁄ 字号 评论关闭

JSON是啥?大家不陌生了吧,估计有人比我还懂,这玩意儿其实我只懂点皮毛,对,就是皮毛,皮和毛,皮包着毛,你看看JSON对象是不是这样?

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

{

      '键名' : 键值,

      '键名' :  键值,

      '键名' : 键值

}

 

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

 

 

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

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

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

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

<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事件,我贴个完整的。

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如下:

<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命名空间。

        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的方法有些复杂有点痛苦呢? 勿急,下一篇博文,我们将玩一些简单的东东。

 

抱歉!评论已关闭.