title author date CreateTime categories
win10 uwp json
lindexi
2018-08-10 19:16:53 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

本文讲的是关于在uwp使用json的简单使用,json应用很多,因为我只是写简单使用,说的东西可能不对或者不符合每个人的预期。如果觉得我有讲的不对的,就多多包含,或者直接关掉这篇文章,但是请勿生气或者发怒吐槽,可以在我博客评论 http://blog.csdn.net/lindexi_gd

现在很多应用都是使用json

如果我们拿到一段json,想要把它变为我们C艹艹可以用的,我们需要先对json的类进行转换,其实很简单,我们在复制一段json

不需要我们对这json转换为类,如果需要手动写很容易写错。因为我们有vs,在我们的编辑,可以看到粘贴为类,这个功能在 VisualStudio 2017 是没有的,需要安装插件。

我们复制完一段json,然后点击粘贴,就好了,自动生成对应的类,不过类的命名有些奇怪。

如果我们拿到一段json,请看下面

{
"results":
[
{
"location":
{
"id": "WX4FBXXFKE4F",
"name": "北京",
"country": "CN",
"path": "北京,北京,中国",
"timezone": "Asia/Shanghai",
"timezone_offset": "+08:00"
},
"daily":
[
{
"date": "2015-09-20",
"text_day": "多云",
"code_day": "4",
"text_night": "晴",
"code_night": "0",
"high": "26",
"low": "17",
"precip": "0",
"wind_direction": "",
"wind_direction_degree": "255",
"wind_speed": "9.66",
"wind_scale": ""
},
{
"date": "2015-09-21",
"text_day": "晴",
"code_day": "0",
"text_night": "晴",
"code_night": "0",
"high": "27",
"low": "17",
"precip": "0",
"wind_direction": "",
"wind_direction_degree": "157",
"wind_speed": "17.7",
"wind_scale": "3"
},
"last_update": "2015-09-20T18:00:00+08:00"
}]
}

如果需要转换这个类,那么就需要在编辑让VisualStudio自动把 json 转类。

    public class Thinw
{ public class Rootobject
{
public Result[] results { get; set; }
} public class Result
{
public Location location { get; set; }
public Daily[] daily { get; set; }
public DateTime last_update { get; set; }
} public class Location
{
public string id { get; set; }
public string name { get; set; }
public string country { get; set; }
public string path { get; set; }
public string timezone { get; set; }
public string timezone_offset { get; set; }
} public class Daily
{
public string date { get; set; }
public string text_day { get; set; }
public string code_day { get; set; }
public string text_night { get; set; }
public string code_night { get; set; }
public string high { get; set; }
public string low { get; set; }
public string precip { get; set; }
public string wind_direction { get; set; }
public string wind_direction_degree { get; set; }
public string wind_speed { get; set; }
public string wind_scale { get; set; }
}
}

很快我们就得到了我们需要序列的类

接着我们使用Nuget安装一下插件

当然我还加上九幽的插件,九幽有几个插件可以获得我们应用数据,我们启动我们关闭,还有广告很好用

我们使用 Nuget 主要下载 Newtonsoft.Json ,这是一个很好用的、性能很高的序列化和反序列。

我们转序可以使用下面代码,实际上只是传入一个泛型而已,反序列的代码实际上可以一句话来写。

        public void Unencoding(string str)
{
var json = JsonSerializer.Create();
Rootobject thinw = json.Deserialize<Rootobject>(new JsonTextReader(new StringReader(str)));
}

如果我们需要把我们的类转为json,这叫序列化,可以尝试使用下面的代码

            var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("data", CreationCollisionOption.ReplaceExisting);
using (TextWriter stream = new StreamWriter(await file.OpenStreamForWriteAsync()))
{
json.Serialize(stream, thinw);
}

这样把我们的类保存在文件,上面用到 UWP 文件读写。

如果觉得我做的简单,想要使用微软的Windows.Data.Json ,其实使用Newtosoft的才好

如果使用Windows.Data.Json,那么需要这样写

JsonArray root = JsonValue.Parse(jsonString).GetArray();
for (uint i = 0; i < root.Count; i++)
{
string name1 = root.GetObjectAt(i).GetNamedString("name");
string description1 = root.GetObjectAt(i).GetNamedString("description");
string link1 = root.GetObjectAt(i).GetNamedString("link");
string cat1 = root.GetObjectAt(i).GetNamedString("cat");
string image1 = root.GetObjectAt(i).GetNamedString("image");
var chan = new RootObject
{
name = name1,
cat = cat1,
description = description1,
image = image1,
link = link1
};
obs_channels.Add(chan);
}

如果属性多,基本上很多人会容易就打错,当然,可以先实例一个RootObject,然后使用新关键字,name去得到实例属性名称当然在我们使用Json会遇到一些属性我们不要的,那么如何json忽略属性,其实很简单,在Newtosoft可以在属性加[JsonIgnore],因为这些比较乱,所以也不打算在这里说。

首先是我们的类,任意的定义

  public class Thine
{
public string Property{set;get;}
public string Ignore{set;get;}
}

我们要把Property包含,但是不包含Ignore,简单的代码是添加JsonIgnore告诉序列化不要序列化这个属性。

  public class Thine
{
public string Property{set;get;}
[JsonIgnore]
public string Ignore{set;get;}
}

但是有时候我们要包含很少,基本都是不包含的,那么如何只用包含,其实我们可以在类加[JsonObject(MemberSerialization.OptIn)]看到了OptIn,其实OptOut就是不包含一些,OptIn就是包含一些

  [JsonObject(MemberSerialization.OptIn)]
public class Thine
{
[JsonProperty]
public string Property{set;get;}
public string Ignore{set;get;}
}

在反序列化时需要注意,不是所有的类都可以反序列化,必须类的属性最后都是基础类型,必须类有默认构造函数没有参数。所以 StorageFile 等就是无法反序列化的,需要使用这篇文章的方法保存用户选择的文件。

序列枚举

例如有一个枚举

    public enum Foo
{
lindexi,
jiuyou,
oschina,
mslaji,
yam,
}

进行序列,可以使用下面代码

             List<Foo> foo=new List<Foo>()
{
Foo.lindexi,
Foo.oschina
}; string str = JsonConvert.SerializeObject(foo);

结果是

    [0,2]

如果对上面的进行反序列会出现和原先一样的结果

但是如果尝试使用其他的枚举,不会出现错误,枚举的数量比原先多的一般就不会出现

                var t = JsonConvert.DeserializeObject<List<KeyboardNavigationMode>>(str);

原来的是 Foo ,现在改为 KeyboardNavigationMode 结果还是一样

如果是数值的,容易出现这个错误那么如何使用枚举的字符串?

在需要使用的枚举类添加 JsonConverter

     [JsonConverter(typeof(StringEnumConverter))]
public enum Foo
{
lindexi,
jiuyou,
oschina,
mslaji,
yam,
}

得到结果

    ["lindexi","oschina"]

但是如果使用的枚举不是自己写的,如使用 Key 枚举,这个是ms写的,不可以在枚举加上,这时可以在属性加上

例如有个属性

            List<Foo> foo = new List<Foo>()
{
Foo.lindexi,
Foo.oschina
};

可以在属性转换时用

                string str = JsonConvert.SerializeObject(foo,new StringEnumConverter());

这样可以做到和上面一样的方法

如果需要转换中文
参见:http://www.cnblogs.com/DomoYao/p/Json.html

参见:http://blog.csdn.net/lovegonghui/article/details/50248455

换行输出

默认的 SerializeObject 输出的字符串是不换行的。例如我序列化了下面的类

结果拿到的数据是:

通过下面的代码就可以让 json 在转换的时候换行

   var jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.Formatting = Formatting.Indented; string str = JsonConvert.SerializeObject(obj, jsonSerializerSettings);

2018-8-10-win10-uwp-json的更多相关文章

  1. win10 uwp json

    本文讲的是关于在uwp使用json的简单使用,json应用很多,因为我只是写简单使用,说的东西可能不对或者不符合每个人的预期.如果觉得我有讲的不对的,就多多包含,或者直接关掉这篇文章,但是请勿生气或者 ...

  2. win10 UWP 序列化

    将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. .NET Framewor ...

  3. win10 uwp 入门

    UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客. 关于UWP介绍可以参见:http://lib.csdn.net/article/csharp/32451 首先需要申请一 ...

  4. win10 uwp httpClient 登陆CSDN

    本文告诉大家如何模拟登陆csdn,这个方法可以用于模拟登陆其他网站. HttpClient 使用 Cookie 我们可以使用下面代码让 HttpClient 使用 Cookie ,有了这个才可以保存登 ...

  5. win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序

    本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...

  6. win10 uwp 使用 Microsoft.Graph 发送邮件

    在 2018 年 10 月 13 号参加了 张队长 的 Office 365 训练营 学习如何开发 Office 365 插件和 OAuth 2.0 开发,于是我就使用 UWP 尝试使用 Micros ...

  7. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  8. Win10 UWP开发实现Bing翻译

    微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...

  9. Win10/UWP开发—使用Cortana语音与App后台Service交互

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

  10. 【Win10 UWP】QQ SDK(二):SDK的回调处理

    上一讲,我们介绍了QQ SDK的使用方法,请看<[Win10 UWP]QQ SDK(一):SDK基本使用方法> 一. 回调的基本形式 从前面的介绍中我们知道,我们的应用和QQ客户端之间需要 ...

随机推荐

  1. Hibernate4教程六:性能提升和二级缓存

    抓取策略(fetching strategy)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.抓取策略可以在O/R映射的元数 ...

  2. aiohttp上报:Got more than 8190 bytes (10160) when reading Status line is too long.错误的解决办法

    通过浏览器向web服务传递base64码的图片时遇到参数过长的问题? 解决办法:查看aiohttp的源码:aiohttp/http_parser.py下找到: class HeadersParser: ...

  3. JDBC、ibatis(mybatis)、Hibernate有什么不同?

    ①JDBC编程流程固定,同时将sql语句和java代码混在了一起,经常需要拼凑sql语句,细节很繁琐: ②ibatis(mybatis)它不完全是一个ORM框架,因为MyBatis需要程序员自己编写S ...

  4. Bootstrap 小功能

    <div class="container"> <div class="navbar-header"> <button type= ...

  5. MAS(转)

    1.为什么要使用微服务? 要说为什么要使用微服务,我们要先说下传统的企业架构模式-垂直架构/单块架构模式,简单点说:我们一般将系统分为三层架构,但是这是逻辑上的三层,而非物理上的三层,这就意味着经过编 ...

  6. PHP随机生成不重复的8位卡号(数字)和卡密(字符串)

    一.生成不重复的随机数字,可自定义长度(最多支持10位数) /** * 生成不重复的随机数字(不能超过10位数,否则while循环陷入死循环) * @param int $start 需要生成的数字开 ...

  7. 【MVC】Spring WebFlux

    一.什么是 Spring WebFlux 下图截自 Spring Boot 官方网站: 结合上图,在了解 Spring WebFlux 之前,我们先来对比说说什么是 Spring MVC,这更有益我们 ...

  8. JindoFS解析 - 云上大数据高性能数据湖存储方案

    JindoFS背景 计算存储分离是云计算的一种发展趋势,传统的计算存储相互融合的的架构存在一定的问题, 比如在集群扩容的时候存在计算能力和存储能力相互不匹配的问题,用户在某些情况下只需要扩容计算能力或 ...

  9. python--闭包函数、装饰器

    先来点补充. x= def foo(): print(x) x= foo() 结果: x= def foo(): global x x= print(x) foo() print(x) 结果: x= ...

  10. Python基础教程(001)--前言

    前言 人生苦短,我用Python. Python的作者,Guido von Rossum,确实是荷兰人.1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数 ...