标签:json

浏览模式: 标准 | 列表 | 图文
flutter 获取API数据时,中文乱码

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

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

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

至此问题解决。

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。好痛苦的事情啊
go语言的json

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,也不会输出。。。
推送通知消息负载内容和本地格式字符串

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

来源: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才被添加的

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

苹果推送注意事项

苹果推送注意事项

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

$arr['aps'] = array(
'badge'=>1,
'sound'=>'',
'alert'=>'xxx'
);

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

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

于是这代码就好写了:

/**
* ApnsService.php
*
* @category
* @package
* @author gouki <gouki.xiao@gmail.com>
* @version 1.0
* @created 2011-10-12-23:45
*/
class ApnsService {
public $token;
public $message;
public $badge = 1;
public $sound;
public $ispad;
public function __construct($token, $message, $badge = null, $sound = null, $ispad = 0) {
$this->token = $token;
$this->message = $message;
$this->badge = $badge;
$this->sound = $sound;
$this->ispad = (int)$ispad;
}
public function send() {
return $this->sendPushInfo();
}
public function sandboxSend() {
return $this->sendPushInfo(true);
}
private function getPayload() {
$body = array();
if ($this->badge) {
$body['aps']['badge'] = $this->badge;
}
if ($this->sound) {
$body['aps']['sound'] = $this->sound;
}
$body['aps']['alert'] = $this->message;
return $body;
}
private function getCertFile() {
return Yii::getPathOfAlias("application") . ($this->ispad ? "/hdDis.pem" : "/iphoneDis.pem");
}
private function getSandboxCertFile() {
return Yii::getPathOfAlias("application") . ($this->ispad ? "/hdDev.pem" : "/iphoneDev.pem");
}
private function getApplePushUrl($isSandbox = false) {
return ($isSandbox == true ? "ssl://gateway.push.apple.com:2195" : "ssl://gateway.sandbox.push.apple.com:2195");
}
private function sendPushInfo($isSandbox = false) {
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert',
($isSandbox == true
? $this->getSandboxCertFile()
: $this->getCertFile())
);
//stream_context_set_option($ctx, 'ssl', 'passphrase', '123456'); //如果设置了密码,这里就不能注释了
$fp = stream_socket_client($this->getApplePushUrl($isSandbox), $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
print "Failed to connect $err $errstr\n";
return false;
} else {
//print "Connection OK\n";
}
$payload = json_encode($this->getPayload());
//echo strlen($payload); //这里可以精心测试,最大不能超过256个字节即strlen超过256后苹果直接不予处理。
$msg = chr(0) . pack("n", 32) . pack('H*', str_replace(' ', '', $this->token)) . pack("n", strlen($payload)) . $payload;
fwrite($fp, $msg);
fclose($fp);
return true;
}
}

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

来自雪候鸟的关于JSON一些提示

来自雪候鸟的关于JSON一些提示

风雪之隅的博客现在也越来越被很多人知道了,当然这与他加入了php的开发组也有关系。这不,开始内爆了。

前两天我在纠正关于json_decode的问题时,看了一下在线手册,才发现json_decode有了第四个可选参数,把BIG_INT当成STRING来处理。
当然看json_decode的时候里面的参数介绍的不多。这不,昨天雪候鸟更新了N多博客,里面就介绍了两篇与JSON相关的东西:

1、让Json更懂中文(JSON_UNESCAPED_UNICODE)
2、JsonSerializable接口

其中第1篇就是我说的BIG_INT相关的那些附加参数,他这么说了:

怎么样, 是不是让大家很开心的改动? 呵呵, 当然, Json在5.4还加入了: JSON_BIGINT_AS_STRING, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES等选项, 如果有兴趣, 大家可以参看: json_encode

所以,比如让中文输出的时候不要变成\uxxxx这种格式就只需要这样:

<?php
echo json_encode("中文", JSON_UNESCAPED_UNICODE);
//"中文" ,如果没加这个参数,以前输出是:"\u4e2d\u6587"

然后JSONSerialize,则是有点象serialize了,但是只针对数据输出,而不是象serialize可以把整个对象序列化。。有点象这样:

<?php
class JsonTest implements JsonSerializable { //看一下这里
private $a, $b;

public function __construct($a, $b) {
$this->a = $a;
$this->b = $b;
}

public function jsonSerialize() { //也就是说这里要主动实现
return $this->a + $this->b;
}
}

echo json_encode(new JsonTest(23, 42));
?>

//65

在使用的时候就可以这样:

<?php
$data = array(
new stdClass();
new JsonTest(1,2),
new JsonTest(3,4),
array(5,6)
);
echo json_encode($data);
?>

//[{},3,7,[5,6]]

雪候鸟也说了:最后提醒一下, PHP 5.4还处于开发阶段, 在最终release之前, 这些特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好.

------
好吧,第一个功能我喜欢,第二个我短时间内还用不到。。。

笔记:json_encode和jquery等

笔记:json_encode和jquery等

一些笔记
1、json_encode与json_decode的。开花石头在村里说,如果json_encode是字符串,那么在解码的时候还是字符串而不是数组,这点与手册上写的不太一样(是指json_decode的第二个参数是true的情况)
具体我没有测试,我想石头既然能够发出来那么一定是有这种情况发生,因此算是做个笔记

2、jquery。在使用$('.xxx').hover时,如何知道当前hover对象在整个$('.xxx')对象中的索引值。事实上,我早就知道有$('li').index()之类的用法,但真的一次都没有成功过。简单的例子:

$('#test li').hover(function(){
alert( $('#test li').index(this) );
},function(){
//...
});

差不多就是这样。了解到索引值是多少后,就可以针对它们做很多事。$("xxx:eq("+index+")").text()等操作都可以操作了。

3、在InfoQ上看到有为PHP用户写的AS简单教程(InfoQ上的PDF下载时为显示404,请使用此链接:http://www.riameeting.com/magazine/pdf/RIAMeetingWeeklyReportNum24.pdf),这个版本是在线的,http://blog.csdn.net/lihe111/archive/2010/01/14/5189572.aspx

4、还是InfoQ,领域驱动设计这本书的简化版,原书我有,只是看infoQ上介绍说,这几章是精选出来的。因此想简单了解的话,确实不错:http://www.infoq.com/resource/minibooks/domain-driven-design-quickly/zh/pdf/dddquickly-chinese-version.pdf

5、对于WEB开发人员来说,dreamweaver和fireworks等是必备工具,如果不是专业的前端人员,d8和f8就足够了。而且很小,只有100M都不到。因为这些不是正版所以我不提供下载地址。

很妖的实现:以JSon来实现TextBox可选择可输入

很妖的实现:以JSon来实现TextBox可选择可输入

这个实现方式有点妖。
原文是用asp.net实现的。我也没有改,因为,json数据的获取在PHP中真是太简单了。拿到数据后json_encode一下就全有了。。

想看的就做个参考吧。我还是觉得妖
这里只是把主要的代码贴出来,不再进行过多的说明,重要的地方以注释的方式进行说明。

<div id="pubDiv" style="background-position: #9999FF; font-size:12px; display:none; z-index:0; overflow:auto; position:absolute; border:#EDEDED 0px solid;background:#EDEDED;"></div>
<script type="text/javascript" language="javascript">
// 注意下面的等号右面,不能是“<%=BuildJson() %>”,因为JSon整体不能是字符串,同时最后也不能加分号:“;”
var strJson = <%=BuildJson() %>

function ShowBdzDiv() {
var dept = document.getElementById("<%=ddlDeptEdit.ClientID %>").value;
// 构建要下拉选择的内容
var strHtml = "<table border=0px cellpadding=0 cellspacing=0 width=120px><tr>";
for (var key in strJson[dept]) {
strHtml += "<tr><td onclick=SetBdz()>" + key + "</td></tr>";
}
strHtml += "</table>";
var oBdz = document.getElementById("<%=txtBdz.ClientID %>");
var oDiv = document.getElementById("pubDiv");
oDiv.innerHTML = strHtml;

// 设置显示的位置,并显示
oDiv.style.top = "99px";
oDiv.style.left = "100px";
oDiv.style.display = "block";

}
// 当点击选择一个内容时
function SetBdz() {
var oBdz = document.getElementById("<%=txtBdz.ClientID %>");
// 把选择内容设置到TextBox上,并隐藏下拉选择项
oBdz.value = event.srcElement.innerText;
HiddenDiv();
}
// 隐藏下拉选择项
function HiddenDiv() {
var oDiv = document.getElementById("pubDiv");
oDiv.style.display = "none";
}
</script>
。。。
<!--这里只有一点要注意:设置AutoCompleteType="Disabled"-->
<asp:TextBox ID="txtBdz" AutoCompleteType="Disabled" onfocus="ShowBdzDiv()" runat="server"></asp:TextBox>

这里要说明的是,这里只实现了下拉选择项的点击选择,不能使用键盘操作。

javascipt的{}中逗号带来的困扰

javascipt的{}中逗号带来的困扰

随便javascript 第5版的书出来,JS的写法也就越来越多了,以前定义一个对象,还得写var o = new Object();现在好了,直接var o = {};

可是这样带来的问题不少(其实是IE和FF的兼容性问题)

下面是一个朋友痛苦的经历:

最近把YUI()引入到了现在做的项目当中,感觉做ajax非常顺手

由于firefox下有firebug这个插件,所以开发的时候都是以ie为准
稍微在ie下做些测试,一般都没有问题。

这次被一个逗号搞得非常辛苦。

var send_email_callback =
{
success:handleSuccess,
failure:handleFailure,
};
这段代码在firefox和ie下都不会报错
firefox运行正常,ie下导致整个脚本失效

调试都是用alert来调试,但是ie下alert的功能也失效了,无论alert放在文件的那个位置,都不会有弹框出来
整个js文件代码长达300行,找的好辛苦。。。
正确的应为: var send_email_callback =
{
success:handleSuccess,
failure:handleFailure
}; 唉,一个逗号引发的辛苦啊。。

这个错误应该是受到php里面array写法的影响
经常在定义array时为了给array添加新值方便,一般都是会再加一个逗号。。。

另外,还有个地方也会导致脚本在ie下失效
_div_sending.className = 'mail_sending';
//_div_sending.class = 'mail_sending';
其中第二行会导致脚本不能运行,也不会报错,同样无论什么地方放一个alert都不会有反应
额,以前看一本书上说,给控件加class的值,这样好像会做到多个浏览器兼容。。。faint,或许是我记错了吧。。
解决的办法,注释掉,或者用yui自带的添加的class的方法
这段代码是几个星期前写的,那个时候还没有看到yui给控件加class的方法
YAHOO.util.Dom.addClass(_div_sending, 'mail_sending');
希望有人可以告诉我,ie下调试js简单的方法
额,我的js的水平也太臭了。。。额。。。。

确实,在"}"前的最后一个","非常害人。在IE下死活会报错,而且FF下面又完全正常。现在我一看报错,就立马检查是否多了这个",",PHP的ARRAY习惯害人啊……总是担心可能会往配置数组里加东西,所以,每行最后都习惯性的加上逗号,现在……不太敢了。