java怎么java读取json格式文件的数据

让天下没有难学的技术
处理JSON的Java API :JSON的简介
处理JSON的Java API :JSON的简介
作者:Jitendra Kotamraju
译者:撒木
处理JSON的各种解析、生成、处理、转换和查询的JAVA API
(JavaScript Object Notation)是一种轻量级的、基于文本的、完全独立于语言的数据交换格式。它非常方便人们和机器的阅读和书写。JSON 有两种结构类型的表现方式:对象和数组。对象是名/值对的无序集合。数组是值(value)的有序集合。值的类型可以是字符串(在双引号中)、数字(整数或浮点数)、逻辑值(true或false)、数组(在方括号中)、对象(在花括号中)、null。
以JSON表示的一个对象去描述一个人。这个人的姓和名都是字符串类型,一个数值表示了年龄,一个对象表示了这个人的地址,还有一个数组对象表示了电话号码。
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": 10021
"phoneNumbers": [
"type": "home",
"number": "212 555-1234"
"type": "fax",
"number": "646 555-4567"
列表 1. JSON表示对象的一个例子
JSON通常被用在Ajax应用、配置、数据库和RESTful web services。几乎所有流行的网站都提供了JSON的数据交换方式在他们的RESTful web services上。
处理JSON的Java API ()提供了各种便捷的API,其中包括解析、生成、转换和使用对象模 型或流来查询JSON。
对象模型的API在内存中产生一个随机存取的树状结构来代表了JSON数据。这个树可以被操作和查询。这种编程模型可以很灵活的处理需要随机存取完整内容的树。但是,对象模型通常都没有流模型效率高,而且需要的存储空间也比流模型多
流API提供了一种以流来解析和生成JSON的方法。它把解析生成JSON的控制权交给了程序猿。流API提供了一种基于事件的解析器并且允许开发者询问下一个事件,而不是再一个回调函数中负责事件的处理。它给予了开发者更多的处理JSON的过程控制。应用程序代码可以处理或抛弃解析器事件,也可以询问下一个事件(pull the event)。流模型适合于部分不需要的数据的随机存取的局部处理。同样的,流API提供了一种通过写一次事件生成结构良好的JSON流。
对象模型API
对象模型API和文件对象模型(DOM)API在xml中很相似。这是一个高级的API,它为JSON对象和数组结构提供了不可变的对象模型。这些JSON结构通过使用 和被表示为对象模型。表格1中展示了对象模型API的主要的类和接口。
JsonObject提供了一个Map视图去存取含有名/值对的无序集合。同样的,JsonArray提供了一个List去存取含有值的有序序列。
表格 1.对象模型API中主要的类和接口
包含产生JSON readers,writers,builders,和他们的工厂对象的静态方法
JsonGenerator
一次一个值的将JSON数据写入一个流中。
JsonReader
从流中读取JSON数据,并且创建一个对象模型在内存中
JsonObjectBuilder
JsonArrayBuilder
在内存中通过向源码中加入一个值,创建一个对象模型或者数组模型
JsonWriter
从内存中拿出一个对象模型写入流中
JsonObject
JsonString
JsonNumber
表示JSON数据中的数据类型.
JsonObject,JsonArray,JsonString 和JsonNumber 是JsonValue的子类型。他们是被定义在API中的常量,有null,true,false的JSON值。
对象模型API使用建造者设计模式,从头创建这些对象模型。应用程序代码可以使用接口JsonObjectBuilder 来创建模型来代表JSON对象。由此产生的模型是JsonObject。应用程序代码可以使用接口JsonArrayBuilder来创建模型来代表JSON数组。由此产生的模型JsonArray。
这些对象模型也可以从一个输入源(例如InputStream或Reader)使用接口JsonReader来创建。同样的,可以写出到一个输出源(例如OutputStream或Writer)使用类JsonWriter。
举个例子,让我们使用对象模型API写个搜索Facebook的公开岗位的code。Facebook的API给我们了搜索结果在列表2中。
"data" : [
{ "from" : { "name" : "xxx", ... }, "message" : "yyy", ... },
{ "from" : { "name" : "ppp", ... }, "message" : "qqq", ... },
列表 2. 搜索Facebook公开岗位的JSON示例
我们可以使用对象模型API取得关于JAVA的名字和他们的岗位。
在列表3中,
第3行创建了JsonR
第5行创建了返回结果的JsonO
第7行循环每一个结果;
第8-11行取得了公布人的姓名和职位,并且打印它们
注意:JsonReader和其他API上的对象可以用于带有资源的try语法中(这也叫做自动资源管理[ARM]).
1 URL url = new URL("/search?q=java&type=post");
2 try (InputStream is = url.openStream();
JsonReader rdr = Json.createReader(is)) {
JsonObject obj = rdr.readObject();
JsonArray results = obj.getJsonArray("data");
for (JsonObject result : results.getValuesAs(JsonObject.class)) {
System.out.print(result.getJsonObject("from").getString("name"));
System.out.print(": ");
System.out.println(result.getString("message", ""));
System.out.println("-----------");
列表 3. 使用对象模型API处理Facebook的岗位。
流API与XML的流API(StAX)类似,它是由接口JsonParser和JsonGenerator组成。JsonParser 包含使用流模型解析JSON数据的方法JsonGenerator包含输出JSON数据到一个输出源的方法。
表格2展示了流API中主要的类和接口
表格 2. 流API中主要的类
包含创建JSON解析器,生成器,和工厂对象的静态方法。
JsonParser
表示一个基于事件的解析器,可以从流中读取JSON数据。
JsonGenerator
每次一个值将JSON数据写出到流中
JsonParser提供了先锋,使用pull 解析对象模型,访问只读的JSON数据。在这个模型中,应用程序代码在解析器接口中,控制线程和方法调用,来使解析器向前移动或者从当前解析器的状态获得JSON数据。
JsonGenerator提供了将JSON数据写入流的方法。生成器可以在JSON对象中写入名/值对,在JSON数组中写入值。
流API是一个低级的API,它被设计用来更效率的处理大量的JSON数据。其他的JSON框架(例如JSON binding) 通过使用API可以继承(implement)。
让我们使用流API来做一下刚才使用对象模型API做过的事情。搜索Facebook的关于JAVA的岗位。
在列表4中,
第1-3行创建了一个流的解析器,
第4-5行取得了下一个事件
第6行寻找KEY_NAME这个事件,
第8到11行读取名字并打印它们,
第14-16行读取职位并输出他们。
当使用对象模型API比较相同的工作,流API提供了一种有效的方式存取名字和职位。
1 URL url = new URL("/search?q=java&type=post");
2 try (InputStream is = url.openStream();
JsonParser parser = Json.createParser(is)) {
while (parser.hasNext()) {
Event e = parser.next();
if (e == Event.KEY_NAME) {
switch (parser.getString()) {
case "name":
parser.next();
System.out.print(parser.getString());
System.out.print(": ");
case "message":
parser.next();
System.out.println(parser.getString());
System.out.println("---------");
列表 4. 使用流API处理Facebook的岗位信息
处理JSON的Java API提供了如下功能:
将输入流解析为不可变的对象或事件流
将事件流或不可变对象写入输出流中
编程操作不可变对象
使用builders编程构建不可变对象
构建数据绑定,转换,查询或其他的操作API基础。JAX-RS 2.0 提供了原始整合为处理JSON的JAVA API。
Jitendra Kotamraju,Oracle技术人员的主要成员,是JSON处理规范领导和GlassFish之后的一个关键工程师。在领导JSON处理计划之前,他负责JAX-WS 2.2 的规范和实现
加入 , 和 !
原创文章,转载请注明: 转载自本文链接地址:
Latest posts by 撒木 ()
Related posts:
(3 votes, average: 4.00 out of 5)
Loading...要解析的json数据如下:
/*请求结果--&{"result_count":10,"lastpg":10,"next_offset":1,"entry_list":[{"id":"4316","name_value_list":{"message":{"value":"\u65b0\u\u8868\uff1aAdministrator\u\u8d1f\u8d23\ue\u4e0a\u6d77\ue\u90e8\u\u300f\u677f\ub,\t\u4e8e 18:11:23\u53d1\u\u7ae0\u3010dsfsd \u3011\uff0c\u8bf7\u60a8\u\u3002"},"sender":{"value":"System"},"recipient":{"value":"xiao"},"stamp":{"value":" 18:11"},"received":{"value":"0"},"parentid":{"value":"4316"}}},{"id":"4292","name_value_list":{"message":{"value":"\u\u8bc4\u8bba\uff1a\u60a8\u53d1\u\u300e\u4e0a\u6d77\ue\u90e8\u\u300f\u677f\ub\udsfsdf\u\u7ae0\uff0c\t\u4e8e 18:12:55\u88ab xiao \u8bc4\u8bba\uff0c\u8bf7\u60a8\u\u3002"},"sender":{"value":"System"},"recipient":{"value":"xiao"},"stamp":{"value":" 18:12"},"received":{"value":"0"},"parentid":{"value":"4292"}}},{"id":"4291","name_value_list":{"message":{"value":"\u8bc4\u8bba\u\uff1a\u60a8\u53d1\u\u677f\ub\udsfsdf\u\u7ae0\u4e2d\u\u8bba\uff0c\t\u4e8e 18:12:14\u88abxiao\u\uff0c\u8bf7\u60a8\u\u3002"},"sender":{"value":"System"},"recipient":{"value":"xiao"},"stamp":{"value":" 18:12"},"received":{"value":"0"},"parentid":{"value":"4291"}}}......*/
解析JSON数据格式
super.handleMessage(msg);
Bundle data = msg.getData();
String Result = data.getString("Result");//取得json数据
Log.i("mylog","请求结果--&" + Result);
JSONObject jsonO
  jsonObject = new JSONObject(Result);
  JSONArray entry_list = jsonObject.getJSONArray("entry_list"); //取得json数组
  lastpg = jsonObject.getInt("lastpg"); //取得json对象中的某个int数据
  for (int i = 0; i & entry_list.length(); i++) {
    JSONObject result = entry_list.getJSONObject(i);//取得json对象
    Log.i("listlog",result.getString("id"));
    String name_value_list = result.getString("name_value_list");//取得json对象中的某个String数据
    jsonObject = new JSONObject(name_value_list);
    JSONObject message = jsonObject.getJSONObject("message");
    JSONObject sender = jsonObject.getJSONObject("sender");
    JSONObject received = jsonObject.getJSONObject("received");
    HashMap&String, Object& map = new HashMap&String, Object&();
    map.put("lvw_custom_name", sender.getString("value"));
    map.put("lvw_custom_description", message.getString("value"));
    map.put("received", received.getString("value"));
    map.put("pm_id", result.getString("id"));
    data1.add(map);
} catch (JSONException e) {
  e.printStackTrace();
阅读(...) 评论()解析json格式数据
来源:博客园
实现目标
  读取文件中的json格式数据,一行为一条json格式数据。进行解析封装成实体类。
  通过google的Gson对象解析json格式数据
  我现在解析的json格式数据为:

{"id": "1403","name": "1.2.3 Diva","has_barcode": true,"barcode_format": "EAN_13","homepage": "http://1-2-3.fr","regions": ["DE","FR"],"other_stores": [],"typos": ["un deux trois","un1deux2trois3"],"logo": "undeuxtrois","android_banner_url": "http://stocardapp.s3-external-/android/banner/undeuxtrois.png","ios_banner_url": "http://stocardapp.s3-external-/ios/banners/undeuxtrois.png","ios_logo_url": "http://stocardapp.s3-external-/ios/icons/undeuxtrois@2x.png"},

代码实现
1、实体类

import java.util.L

public class ImportBrand
{
private int
private S
private String has_
private String barcode_
private S
private List&String&
private List&String& other_
private List&String&
private S
private String android_banner_
private String ios_banner_
private String ios_logo_
@Override
public String toString()
// TODO Auto-generated method stub
return "id=" + id + ",name = " + name + ",has_barcode = " + has_barcode + ",barcode_format=" + barcode_format +
",homepage =" + homepage + ",regions = " + regions +",logo = " + logo +",android_banner_url = " + android_banner_url +
",ios_banner_url=" + ios_banner_url + ",ios_logo_url = " + ios_logo_
public int getId()
return
public void setId(int id)
this.id =
public String getName()
return
public void setName(String name)
this.name =
public String getHas_barcode()
return has_
public void setHas_barcode(String has_barcode)
this.has_barcode = has_
public String getBarcode_format()
return barcode_
public void setBarcode_format(String barcode_format)
this.barcode_format = barcode_
public String getHomepage()
return
public void setHomepage(String homepage)
this.homepage =
public List&String& getRegions()
return
}


public void setRegions(List&String& regions)
this.regions =
}


public List&String& getOther_stores()
return other_
public void setOther_stores(List&String& other_stores)
this.other_stores = other_
public List&String& getTypos()
return
public void setTypos(List&String& typos)
this.typos =
public String getLogo()
return
public void setLogo(String logo)
this.logo =
public String getAndroid_banner_url()
return android_banner_
public void setAndroid_banner_url(String android_banner_url)
this.android_banner_url = android_banner_
public String getIos_banner_url()
return ios_banner_
public void setIos_banner_url(String ios_banner_url)
this.ios_banner_url = ios_banner_
public String getIos_logo_url()
return ios_logo_
public void setIos_logo_url(String ios_logo_url)
this.ios_logo_url = ios_logo_
}
}

2、读取文件

import java.io.BufferedR
import java.io.F
import java.io.FileInputS
import java.io.InputStreamR
import java.util.ArrayL
import java.util.L

/**
 * 读取文件
 * 
 * @author zcr
 * 
 */
public class ImportFile
{
* 功能:Java读取txt文件的内容 步骤:1:先获得文件句柄 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取
* 3:读取到输入流后,需要读取生成字节流 4:一行一行的输出。readline()。 备注:需要考虑的是异常情况
* @param filePath
文件路径[到达文件:如: D:\aa.txt]
* @return 将这个文件按照每一行切割成数组存放到list中。
public static List&String& readTxtFileIntoStringArrList(String filePath)
List&String& list = new ArrayList&String&();
String encoding = "UTF-8";
File file = new File(filePath);
if (file.isFile() && file.exists())
{ // 判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file), encoding);// 考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;

while ((lineTxt = bufferedReader.readLine()) != null)
if (isRightFormat(lineTxt))
list.add(lineTxt.substring(lineTxt.indexOf("{"),lineTxt.lastIndexOf(',')));
read.close();
System.out.println("找不到指定的文件");
catch (Exception e)
System.out.println("读取文件内容出错");
e.printStackTrace();
}

return
}

public static void main(String argv[])
String filePath = "C:\\Users\\owner\\Desktop\\卓信科技实习\\stores.json";
List&String& dataList = readTxtFileIntoStringArrList(filePath);
for(int i = 0 ; i & dataList.size() ; i ++) 
System.out.println(dataList.get(i)); 
System.out.println(dataList.size());
}

* 判断数据是否是合法的格式
* @param jsonStr
带判断的数据
返回该行是否是正确的格式
public static boolean isRightFormat(String jsonStr)
return jsonStr.matches("[\\p{Space}]*[{]{1}.*[}]{1}[,]{1}");
}

}

3、方法调用及测试

/**
 * 格式化json数据
 * @author zcr
 *
 */
public class FormatJson
{
public static void main(String[] args)
String filePath = "C:\\Users\\owner\\Desktop\\卓信科技实习\\stores.json";
List&ImportBrand& brandList = FormatJson.formatFileListToBrand(filePath);
for(int i = 0 ; i & brandList.size() ; i ++)
System.out.println(brandList.get(i));
System.out.println(brandList.size());
* 将json格式数据转换成Import对象
* @param jsonStr
带转换的json对象
json格式数据对应的对象
public static ImportBrand formatFromJsonToObject(String jsonStr)
Gson gson = new Gson();
ImportBrand brand = gson.fromJson(jsonStr,ImportBrand.class);
return
* 将String类型的json格式转换为ImportBrand类型的集合
* @param jsonStrList
待转换的json格式List对象
json格式对象转换而成的ImportBrand对象集合
public static List&ImportBrand& formatStringListToBrand(List&String& jsonStrList)
List&ImportBrand& listImportBrand = new ArrayList&ImportBrand&();
int size = jsonStrList.size();
for(int i = 0 ; i & i ++)
listImportBrand.add(formatFromJsonToObject(jsonStrList.get(i)));
return listImportB
* 读取文件,将json格式的数据转换成List对象的ImportBrand
* @param filePath
读取的文件路径
public static List&ImportBrand& formatFileListToBrand(String filePath)
List&String& dataList = ImportFile.readTxtFileIntoStringArrList(filePath);
List&ImportBrand& brandList = formatStringListToBrand(dataList);
return brandL
}
}

  致谢:感谢您的阅读.
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动7160人阅读
Java(49)
有时候可能会用到json格式进行数据的传输,那么怎么把接收到的数据解析出来呢? 下面介绍两种解析json数据的方法:
&&&&&& 1、通过谷歌的Gson来进行解析:&
json数据:sTotalString = {&message&:&success&,&result&:[{&surveyid&:&1&,&surveyname&:&B&}{surveyid&:&2&,&surveyname&:&C&}]};&
两个VO类:&
json格式转换成object类型:
&&&&& 2、通过json-org.jar包进行解析:&
json数据:sTotalString = {&message&:&success&,&result&:[{&surveyid&:&1&,&surveyname&:&B&}{surveyid&:&2&,&surveyname&:&C&}]};&
一个VO类:&
json格式转换成object类型:&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1430252次
积分:11581
积分:11581
排名:第1326名
原创:112篇
转载:238篇
评论:161条
(2)(1)(7)(23)(9)(8)(20)(6)(17)(59)(52)(51)(58)(4)(1)(1)(2)(9)(1)(3)(2)(4)(8)(2)}

我要回帖

更多关于 java如何读取json数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信