java工具类11.1之Gson,Jsonobject,中文乱码,接口
来源:互联网 发布:java生命周期包括 编辑:程序博客网 时间:2024/05/16 00:46
哎,上一周没有总结,主要是做了Gson数据转换,其实就是从一个接口拿出来json数据中转一下在传给前台。
一。首先maven依赖
<dependency>
<groupId>org.codeartisans</groupId>
<artifactId>org.json</artifactId>
<version>20131017</version>
</dependency>
<!-- gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.5</version>
</dependency>
二.从接口取数据,这里从接口中拿数据分两种情况;
public static JSONObject getUrl(String source,String name){
StringBuilder builder = new StringBuilder();
try {
// source = URLEncoder.encode(source);
System.out.println("source----"+source);
URL url = new URL(source);
URLConnection uc = url.openConnection();
// uc.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream(),"UTF-8"));
String line = null;
while((line = br.readLine())!=null){
// line = new String(line.getBytes("utf-8"), "utf-8");
builder.append(line);
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String message = builder.toString();
message = judgeBrace(message,name);
JSONObject jsonObject = new JSONObject(message);
return jsonObject;
}
2.这个接口是post请求
// 把资源转换成String,再转换成jsonobject,name:为返回的json起名字
public static JSONObject getPostUrl(String source,String name){
StringBuilder builder = new StringBuilder();
try {
URL url = new URL(source);
URLConnection uc = url.openConnection();
HttpURLConnection httpcoon = (HttpURLConnection) url.openConnection();
httpcoon.setDoOutput(true);
httpcoon.setDoInput(true);
httpcoon.setRequestMethod("POST");
InputStream is = httpcoon.getInputStream();
uc.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
String line = null;
while((line = br.readLine())!=null){
// line = new String(line.getBytes("utf-8"), "utf-8");
builder.append(line);
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String message = builder.toString();
// System.out.println(message.equals("[]"));
message = judgeBrace(message,name);
JSONObject jsonObject = new JSONObject(message);
return jsonObject;
}
3.然后有一个judgeBrace()的方法,
是我用来判断从接口中取出来的数据有没有{}包围,还是只是简单的【】包围的数组,
如果是{},传入的参数name就没用了,如果是【】会返回这样的数据{name:【】},就是要给这个返回的json定义一个名字而已。
代码:
// brace大括号,把从接口中读出来json数据没有{}包围,没有名字的,用{}包围并起一个名字
public static String judgeBrace(String message,String name){
StringBuffer sb = new StringBuffer();
int begin = message.indexOf("{");
// System.out.println("begin::"+begin);
if(begin == 0){
sb.append(message);
}else{
sb.append("{");
sb.append(name+":");
sb.append(message);
sb.append("}");
}
return sb.toString();
}
这样就ok了,source格式:http://api.公司域名.com/api/v2/brand/list
期间使用的话会出现异常; java.io.FileNotFoundException: http://api.s。。。。。。。 org.json.JSONException: Missing value at 11 [character 12 line 1]
就是传入的资源url找不到,可能是因为本来就把url定义错了,或者是openConnection那里打开流出错了,具体的现在也忘了怎么解决了,google呗....基本上以上两种请求搞的定。。
三:拿出来jsonObject后要转换成自己对应的List了或entity了
private int api_type;
private String image;
private String api_url_method;
private int height;
private int width;
private int brand_id;
private String api_url;
private int like;
private Boolean follow;
private String title;
private List<Banner> banner;
public static List<MyShop> getAllShop(JSONObject jsonObject){
// 已测试可用
List<MyShop> shops = new ArrayList<MyShop>();
JSONArray array = jsonObject.getJSONArray("shop");
Gson gson = new Gson();
shops = gson.fromJson(array.toString(), new TypeToken<List<MyShop>>() {
}.getType());
return shops;
}
搞定!
具体的json转换成Bean,转换成List;又或List,Bean转换成jsonObject,
google上一搜Gson一大推,用的时候在找!
附个简单的Gson使用连接:
http://blog.csdn.net/lk_blog/article/details/7685169
四:最后一步!创建自己的接口,封装好数据:
public static String getAllSiderBar(){
String url = Http.Tablet.siderBar;
JSONObject jsonObject = getUrl(url, "siderBar");
JSONArray array = jsonObject.getJSONArray("siderBar");
Gson gson = new Gson();
List<SiderbarModel> list = gson.fromJson(array.toString(), new TypeToken<List<SiderbarModel>>() {
}.getType());
String api_url = null;
for(SiderbarModel element:list){
List<Banner> banners = element.getList();
for(Banner ban:banners){
url = ban.getUrl();
String close = CloseUrl.close(url);
ban.setUrl(close);
}
}
String all = gson.toJson(list);
return all;
}
public
@ResponseBody
String getSiderBar(SitePreference sitePreference, Device device,
Model model, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, HttpSession session) {
System.out.println("siderBar");
String siderBar = JsonUtil.getAllSiderBar();
return siderBar;
}
这样启动程序,在网址中输入 “http://ip:8080/项目名称/控制器名/接口名” 就可以返回json数据了!
在这里必须要注意这行代码:String all = gson.toJson(list);只有这样才会返回json类型数据,具体什么原理就不晓得了。。
最后:一些小细节的处理问题
1.比如接口传参数为中文会乱码
接口中传过来key=中文;;;;而不是这种类型的“中文”,会乱码报错什么的,解决方法
byte[] temp=key.getBytes("iso8859-1");
key = new String(temp);
// 搜索
@RequestMapping(value = "/search", method = RequestMethod.POST)
public
@ResponseBody
String getSearch(SitePreference sitePreference, Device device,
Model model, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, HttpSession session,
@RequestParam(value="keyword") String key,
@RequestParam(value="page",required=false,defaultValue="1")int page) {
System.out.println("keyword::"+key);
String goods = null;
if(key != null){
try {
byte[] temp=key.getBytes("iso8859-1");
key = new String(temp);
goods = JsonUtil.getSearch(key,page);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return goods;
}
- java工具类11.1之Gson,Jsonobject,中文乱码,接口
- JSON字符串Gson,JSONObject解析中文乱码,接口
- 接口测试之JsonObject
- 接口测试之JsonObject
- 接口测试之JsonObject
- android JSON解析之JSONObject与GSON
- android JSON解析之JSONObject与GSON
- Gson:将Java对象转换为JsonObject
- java 之JSONObject 相关6个包(或gson一个包)和"NestableRuntimeException"错误
- java 之JSONObject 相关6个包(或gson一个包)和"NestableRuntimeException"错误
- JAVA工具类集锦6--中文乱码处理类
- Android工具类之Gson封装类
- java学习之 JSONObject
- (转)Android JSON解析之JSONObject与GSON
- Java下json的解析方法-----GSON与JSONObject
- Java下json的解析方法-----GSON与JSONObject
- Java下json的解析方法-----GSON与JSONObject
- Java下json的解析方法-----GSON与JSONObject
- javascript获取页面宽度高度及屏幕分辨率
- 图片的压缩与裁剪
- zTree异步加载菜单节点--从数据库中查询
- 页面回退的方式
- shell脚本----------路由和数据库的同步
- java工具类11.1之Gson,Jsonobject,中文乱码,接口
- 数组
- RAII惯用法:C++资源管理的利器
- 请求WCF时:HTTP 请求已超过分配的超时。为此操作分配的时间可能是较长超时的一部分
- NHibernateHelper
- VMware Player 虚拟机中音乐播放无声音 问题
- Java开发中使用Oracle数据库的一点注意事项
- 说说哪本书是对程序员最有影响、每个程序员都该阅读的书?
- zoj 1406 poj 1251 Jungle Roads