SON是啥?大家不陌生了吧,估计有人比我还懂,这玩意儿其实我只懂点皮毛,对,就是皮毛,皮和毛,皮包着毛,你看看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的方法有些复杂有点痛苦呢? 勿急,下一篇博文,我们将玩一些简单的东东。