手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:json

flutter 获取API数据时,中文乱码

在使用flutter的http库请求API时,发现返回的数据均为乱码,例如这样:上海市长宁区长宁路1189号来福士广场东区401-402

原来使用的是:json.decode(response.body),看来不能直接对字符串进行处理。所以还是安稳的改用:json.decode(utf8.decode(response.bodyBytes))

至此问题解决。

 

Tags: decode, json

golang的json处理

 golang的Json处理还算是比较方便的吧?

比如:json.Marshal就完成了处理。
 
OK,开始说事儿:
1、
var s = make(map[string]interface{})
s["userid"] = "123"
s["time"] = "12345"
result , _ = json.Marshal(s);
println(string(result))
这时候你会发现,打印出来的json数据。。。time居然在前面。。。map没有顺序,果然是这样的。
 
那怎么把userid放在最前面呢?
 
2、type JsonData struct{
UserId string `json:"userid"`
Time string `json:"time"`
}
j := JsonData{UserId:"123",Time:"12345"}
result,_ = json.Marshal(j);
println(result);
这时候出来的才是按顺序的json数据
 
这两种情况根据需要写吧。其实我自己是比较偏向于第一种,json要顺序干嘛。不过有些程序写的比较硬编码,不是按JSON解析的话,就只能用第二种,定义标准的输出了。。
再加上之前我也记录过,json.Marshal,只针对struct中的首字符大写的KEY进行encode,小写直接就忽略,所以还必须得写上tag。好痛苦的事情啊

Tags: json, golang

go语言的json

 在写一段代码测试的时候,用上了json类,因为json还算是比较常用的,所以这个的转换什么的要先掌握好。

吭嗞吭嗞写完代码,发现输出都是空,想想不科学啊,struct还是struct,为什么都输出空呢。
想着astaxie说过为了给大家写文档,特地写了一个项目gopkg,于是上去看了看:https://github.com/astaxie/gopkg/blob/master/encoding/json/Marshal.md
 
咦,代码结构和程序都是几乎一样的,那为什么会出错呢?
去群里问了一下,原来就是因为首字母小写的问题。
 
一直以为只有func的首字母大小写代表了 公有方法和私有方法,原来,变量这玩意也是这个含义。。。纠结,做个笔记备份一下:
贴出错误代码:
type ColorGroup struct {
id    int
name  string
color []string
}
colorgroups := ColorGroup{
id:    1,
name:  "reds",
color: []string{"a", "b", "c"},
}
b, _ := json.Marshal(colorgroups)
os.Stdout.Write(b)
----
struct中的变量要注意大小写。。。。。
小写的话,在转换的时候就会隐藏掉,可以根据情况进行设置
当然,如果确实 需要小写,又需要输出,怎么办呢??
 
可以写tag ,参考:
 
 type ColorGroup struct {
Id    int`json:"id"`
name  string `json:"name"`
color []string `json:"color"`
}
反正。。。struct输出json,一定要大写,但是如果要变成输出小写,就得用tag
如果原来就是小写,再怎么写TAG,也不会输出。。。

Tags: json, golang

推送通知消息负载内容和本地格式字符串

来源:http://hi.baidu.com/tangly888/blog/item/62948520121870559358074f.html

翻译苹果文档 地址:  翻译:tangly

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW9

推送通知消息负载内容

每个推送通知都带有内容负载,这个负载内容会被应用程序下载并提醒用户收到数据。负载内容最大允许为256个字节,苹果推送通知服务器拒绝任何超过最大负载字节的推送通知。记住,通知的提交是“尽力而为”,它并不能得到保证。

对于每一个通知,供应商组成一个JSON自动对象来严格遵守RFC 4627协议,这个字典必须通过aps键来包含另一个字典的标示,aps键包含一个或多个属性,指定以下操作:

1. 向用户显示一个提示消息

2. 应用程序图标上的一个徽章号码

3. 可播放的声音

警告: 警告你可以将提示消息,徽章图标号码,播放声音结合成一个单一的通知消息,你应该考虑到推送通知的人机界面问题,例如,用户可能受到频繁的提示消息和警告声音,这然人烦。

当通知到达时,如果这时候目标程序没有运行,这提示消息,声音,徽章号码会被播放或被显示;如果应用程序正在运行,ios将它作为一个NSDictionary对象提供给应用程序委托,这个字典收录了相应COcoa属性列表中的对象

供应商可以指定评估命名以外的消息内容,自定义消息负载内容,自定义值必须使用Json结构和基本类型:字典(对象),数组,字符串,数字,boolean。作为定制消息数据,你不应该包含用户的一些信息。相反,为设置上下文(用户界面)或内部指标为目的来使用它。例如,当供应商发送通知的时候,一个自定义通知消息可能会成为一个会话标示符被消息客户端应用或时间确认来使用。提示消息的任何行为都不应该具有破坏性,如删除客户设备上的数据

关键:由于传送不能够被保证,所以你不应该依赖远程通知设施提供有效负载消息内容给应用程序,不要再消息负载内容中带有敏感数据,你使用它仅是告诉用户此应用有新的数据可用了

3-1中列出了有关苹果服务器消息负载内容的键和预期值

Key

类型

Comment

alert

字符串或字典

如果包含这个这个属性 iOS 将会显示一个标准的提示你可用指定一个字符串作为提醒或作为字典的值如果你指定了一个字符串它会变成有两个按钮的警报消息关闭和显示如果用户点击查看应用程序将会启动

另外你可以指定一个字典来作为提示的内容对于这类字典,请查看表3-2

badge

数字

这个数字将作为应用程序的的徽章图标显示如果此属性不存在任何当前显示的徽章号码将会被删除

sound

字符串

它是捆绑再应用程序的声音文件名这个声音文件播放声音警报如果这个声音文件不存在或指定默认值,这时会播放预设的警报音它的音频必须是兼容的系统数据格式之一详细信息,请阅读“”准备定义提示音

 

 

 

3-1 alert属性的子属性

Key

Value type

Comment

body

string

The text of the alert message.

action-loc-key

字符串或空

如果字符串是指定的将显示带有两个按钮的警报其行为请看表3-1然而, ios 用字符串作为键来获得当前本地化的字符串,并将其用于右边按钮的标题,代替了view如果字符串值为null,系统将显示一个简单的“确定”按钮,当点击时,将会简单的消除按钮 Localized Formatted Strings 获得更多消息

loc-key

字符串

本地提示消息的一个字符串钥匙, 字符串钥匙可以格式化这样%@ and %n$ 在loc-args指定参数变量 Localized Formatted Strings 可以获得更多信息.

loc-args

字符串数组

变量的字符串值格式化再loc-key出现 Localized Formatted Strings 可以获得更多信息 .

launch-image

字符串

图形文件名在应用程序中已经绑定; 它可能包括扩展或省略.  当用户点击动作按钮或移动动作滑块,图片将会被显示出来. I如果这个属性没有指定系统会使用以前的图片,通过在应用程序的Info.plist键来使用图像识别或返回到默认的png文件

这个属性再ios4.0才被添加的

注意:如果你想要iphoneipadipod touch设备将一个通知作为消息文本来显示,那就的有关闭和显示两个按钮

Tags: 推送, budge, json

苹果推送注意事项

关于苹果的推送服务,网上的相关资料非常多,最简单的就是组合成一个数组,类似:

XML/HTML代码
  1. $arr['aps'] = array(  
  2.     'badge'=>1,  
  3.     'sound'=>'',  
  4.     'alert'=>'xxx'      
  5. );  

然后用json_encode处理一下之后,用ssl的方式发送给苹果:

XML/HTML代码
  1. chr(0) . pack("n", 32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n", strlen($payload)) . $payload;  

$devideToken是设备的token,$payload就是上述的数组json_encode之后的数据。
测试的话是发给:ssl://gateway.sandbox.push.apple.com:2195,正式的话,将sandbox去掉即OK

于是这代码就好写了:

PHP代码
  1. /** 
  2.  * ApnsService.php 
  3.  * 
  4.  * @category 
  5.  * @package 
  6.  * @author   gouki <gouki.xiao@gmail.com> 
  7.  * @version 1.0 
  8.  * @created 2011-10-12-23:45 
  9.  */  
  10. class ApnsService {  
  11.     public $token;  
  12.     public $message;  
  13.     public $badge = 1;  
  14.     public $sound;  
  15.     public $ispad;  
  16.     public function __construct($token$message$badge = null, $sound = null, $ispad = 0) {  
  17.         $this->token = $token;  
  18.         $this->message = $message;  
  19.         $this->badge = $badge;  
  20.         $this->sound = $sound;  
  21.         $this->ispad = (int)$ispad;  
  22.     }  
  23.     public function send() {  
  24.         return $this->sendPushInfo();  
  25.     }  
  26.     public function sandboxSend() {  
  27.         return $this->sendPushInfo(true);  
  28.     }  
  29.     private function getPayload() {  
  30.         $body = array();  
  31.         if ($this->badge) {  
  32.             $body['aps']['badge'] = $this->badge;  
  33.         }  
  34.         if ($this->sound) {  
  35.             $body['aps']['sound'] = $this->sound;  
  36.         }  
  37.         $body['aps']['alert'] = $this->message;  
  38.         return $body;  
  39.     }  
  40.     private function getCertFile() {  
  41.         return Yii::getPathOfAlias("application") . ($this->ispad ? "/hdDis.pem" : "/iphoneDis.pem");  
  42.     }  
  43.     private function getSandboxCertFile() {  
  44.         return Yii::getPathOfAlias("application") . ($this->ispad ? "/hdDev.pem" : "/iphoneDev.pem");  
  45.     }  
  46.     private function getApplePushUrl($isSandbox = false) {  
  47.         return ($isSandbox == true ? "ssl://gateway.push.apple.com:2195" : "ssl://gateway.sandbox.push.apple.com:2195");  
  48.     }  
  49.     private function sendPushInfo($isSandbox = false) {  
  50.         $ctx = stream_context_create();  
  51.         stream_context_set_option($ctx'ssl''local_cert',  
  52.                                     ($isSandbox == true  
  53.                                             ? $this->getSandboxCertFile()  
  54.                                             : $this->getCertFile())  
  55.         );  
  56.         //stream_context_set_option($ctx, 'ssl', 'passphrase', '123456'); //如果设置了密码,这里就不能注释了  
  57.         $fp = stream_socket_client($this->getApplePushUrl($isSandbox), $err$errstr, 60, STREAM_CLIENT_CONNECT, $ctx);  
  58.         if (!$fp) {  
  59.             print "Failed to connect $err $errstr\n";  
  60.             return false;  
  61.         } else {  
  62.             //print "Connection OK\n";  
  63.         }  
  64.         $payload = json_encode($this->getPayload());  
  65.         //echo strlen($payload); //这里可以精心测试,最大不能超过256个字节即strlen超过256后苹果直接不予处理。  
  66.         $msg = chr(0) . pack("n", 32) . pack('H*'str_replace(' '''$this->token)) . pack("n"strlen($payload)) . $payload;  
  67.         fwrite($fp$msg);  
  68.         fclose($fp);  
  69.         return true;  
  70.     }  
  71. }  

上面的代码非常简单只是作了一个简单的处理和封装。不过有部分路径是基于yii的,所以要改一下就OK了。
主要是自己的记录。

Tags: 推送, badge, json

Records:912