Ⅰ 如何編寫一個jsON解析器
編寫一個JSON解析器實際上就是一個函數,它的輸入是一個表示JSON的字元串,輸出是結構化的對應到語言本身的數據結構。
和XML相比,JSON本身結構非常簡單,並且僅有幾種數據類型,以java為例,對應的數據結構是:
"string":Java的String;
number:Java的Long或Double;
true/false:Java的Boolean;
null:Java的null;
[array]:Java的List<Object>或Object[];
{"key":"value"}:Java的Map<String, Object>。
解析JSON和解析XML類似,最終都是解析為內存的一個對象。出於效率考慮,使用流的方式幾乎是唯一選擇,也就是解析器只從頭掃描一遍JSON字元串,就完整地解析出對應的數據結構。
本質上解析器就是一個狀態機,只要按照JSON定義的格式(參考http://www.json.org,正確實現狀態轉移即可。但是為了簡化代碼,我們也沒必要完整地實現一個字元一個字元的狀態轉移。
解析器的輸入應該是一個字元流,所以,第一步是獲得Reader,以便能不斷地讀入下一個字元。
在解析的過程中,我們經常要根據下一個字元來決定狀態跳轉,此時又涉及到回退的問題,就是某些時候不能用next()取下一個字元,而是用peek()取下一個字元,但字元流的指針不移動。所以,Reader介面不能滿足這個需求,應當進一步封裝一個CharReader,它可以實現:
char next():讀取下一個字元,移動Reader指針;
char peek():讀取下一個字元,不移動Reader指針;
String next(int size):讀取指定的N個字元並移動指針;
boolean hasMore():判斷流是否結束。
JSON解析比其他文本解析要簡單的地方在於,任何JSON數據類型,只需要根據下一個字元即可確定,仔細總結可以發現,如果peek()返回的字元是某個字元,就可以期望讀取的數據類型:
{:期待一個JSON object;
::期待一個JSON object的value;
,:期待一個JSON object的下一組key-value,或者一個JSON array的下一個元素;
[:期待一個JSON array;
t:期待一個true;
f:期待一個false;
n:期待一個null;
":期待一個string;
0~9:期待一個number。
但是單個字元要匹配的狀態太多了,需要進一步把字元流變為Token,可以總結出如下幾種Token:
END_DOCUMENT:JSON文檔結束;
BEGIN_OBJECT:開始一個JSON object;
END_OBJECT:結束一個JSON object;
BEGIN_ARRAY:開始一個JSON array;
END_ARRAY:結束一個JSON array;
SEP_COLON:讀取一個冒號;
SEP_COMMA:讀取一個逗號;
STRING:一個String;
BOOLEAN:一個true或false;
NUMBER:一個number;
NULL:一個null。
然後,將CharReader進一步封裝為TokenReader,提供以下介面:
Token readNextToken():讀取下一個Token;
boolean readBoolean():讀取一個boolean;
Number readNumber():讀取一個number;
String readString():讀取一個string;
void readNull():讀取一個null。
由於JSON的Object和Array可以嵌套,在讀取過程中,使用一個棧來存儲Object和Array是必須的。每當我們讀到一個BEGIN_OBJECT時,就創建一個Map並壓棧;每當讀到一個BEGIN_ARRAY時,就創建一個List並壓棧;每當讀到一個END_OBJECT和END_ARRAY時,就彈出棧頂元素,並根據新的棧頂元素判斷是否壓棧。此外,讀到Object的Key也必須壓棧,讀到後面的Value後將Key-Value壓入棧頂的Map。
如果讀到END_DOCUMENT時,棧恰好只剩下一個元素,則讀取正確,將該元素返回,讀取結束。如果棧剩下不止一個元素,則JSON文檔格式不正確。
最後,JsonReader的核心解析代碼parse()就是負責從TokenReader中不斷讀取Token,根據當前狀態操作,然後設定下一個Token期望的狀態,如果與期望狀態不符,則JSON的格式無效。起始狀態被設定為STATUS_EXPECT_SINGLE_VALUE | STATUS_EXPECT_BEGIN_OBJECT | STATUS_EXPECT_BEGIN_ARRAY,即期望讀取到單個value、{或[。循環的退出點是讀取到END_DOCUMENT時。
Ⅱ JAVA Json 嵌套解析
{"user_get_response":{"user":{
"buyer_credit":{
"good_num":0,
"level":0,
"score":0,
"total_num":0
},
"created":"2009-09-30 13:15:54",
"last_visit":"2009-12-22 13:31:58",
"location":{},
"nick":"sandbox_c_23",
"seller_credit{
"good_num":0,
"level":0,
"score":0,
"total_num":0
}
}}}
String json = readJSONString(request);
JSONObject jsonObject = null;
String responseText = null;
String
try {
jsonObject = new JSONObject(json);
String user_get_response=jsonObject.getString("user_get_response");
JSONObject jsonObject_1=new JSONObject(user_get_response);
String user=jsonObject_1.getString("user");
JSONObject jsonObject_2=new JSONObject(user);
....
}
依次類推
Ⅲ 如圖所示這種json數據格式怎麼用Java解析成一個list集合 求大佛解答
import net.sf.json.JSONObject;
//先聲明一個JSONObject對象 沒有JSONObject的話要引上面這個jar包
JSONObject json = null;
//將你的json數據賦給json
json = 你的json數據;
//聲明一個JSONArray
JSONArray jsonArray = null;
//拿jsonArray獲取json中的數內據
jsonArray = json.getJSONArray("news_item");
然後可以容遍歷一下這個jsonArray 看看有什麼問題
Ⅳ java中怎樣解析webservice返回的json數據
json(javascript Object Notation 的縮寫)是一個基於文本的,人類可讀的,開放標準的輕量級數據交換格式。它繼承了javascript中的簡單數據結構和相關數組對象,稱為對象。不管它 和javascript的瓜葛,json是語言獨立的,幾乎所有編程語言都能解析它。
json以鍵值對來表示數據。每個值被一個鍵名字引用(鍵名字是個string)。如果你想以json表示人名,他們的名字將被"name"鍵引用,如下:
「name」 : 「James」
所以json用一種容易被應用程序傳遞的方式表現數據,非常完美。
所以當從webservice解析數據時,你要做的第一件事就是搞清楚你的模型。下面我們會分析webservice的響應數據,搞清楚哪些bit代表對象,對象數組,對象所屬的欄位,等等。
但是json可以表示哪些類型的數據呢?
1.對象是大括弧內的所有東東
2.字元串用雙引號
3.數字只是簡單的顯示,如 12345
4. 數組由中括弧包圍
5.布爾值從'true'和'false'獲得,沒有引號
6.null值由'null'表示,沒有引號
Ⅳ java怎麼使用gson解析json字元串
Gson是谷歌推出的解析json數據以及將對象轉換成json數據的一個開源框架. 現在json因其易讀性和高效率而被廣泛的使用著.
相對於java以及其它json的解析框架,Gson非常的好用.
簡單來講就是根據json的數據結構定義出相應的javabean --->"new"出Gson的實例gson---->gson.fromJson(jsonString,JavaBean.class) 即可.
下面給出一個實例來說明.
步驟1:目標:將從webservice傳回的json
{
"status":0,
"result":{
"location":{
"lng":103.98964143811,
"lat":30.586643130352
},
"formatted_address":"四川省成都市雙流縣北一街154",
"business":"簇橋,金花橋",
"addressComponent":{
"city":"成都市",
"district":"雙流縣",
"province":"四川省",
"street":"北一街",
"street_number":"154"
},
"cityCode":75
}
}
先普及下json數據格式定義: json數據只有兩種格式.
一種是對象: 一個大括弧包裹的內容就是一個對象.裡面是無數個逗號相間隔的鍵值對
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}
一種是數組:一個方括弧包裹的內容就是一個數組,裡面是無數個逗號相間隔的json對象
如:
{
"people":[
{
"firstName":"Brett",
"lastName":"McLaughlin",
"email":"aaaa"
},
{
"firstName":"Jason",
"lastName":"Hunter",
"email":"bbbb"
},
{
"firstName":"Elliotte",
"lastName":"Harold",
"email":"cccc"
}
]
}
步驟2 定義json數據格式對應的javaBean
publicclassResult{
privateIntegerstatus;
privateResultDetailresult;
publicResult(){
}
publicResult(Integerstatus,ResultDetailresult){
super();
this.status=status;
this.result=result;
}
publicResultDetailgetResult(){
returnthis.result;
}
publicIntegergetStatus(){
returnthis.status;
}
publicvoidsetResult(ResultDetailresult){
this.result=result;
}
publicvoidsetStatus(Integerstatus){
this.status=status;
}
@Override
publicStringtoString(){
return"Result[status="+this.status+",result="+this.result
+"]";
}
}
publicclassResultDetail{
Locationlocation;
Stringformatted_address;
;
Stringbusiness;
StringcityCode;
publicResultDetail(){
super();
//TODOAuto-generatedconstructorstub
}
publicResultDetail(Locationlocation,Stringformatted_address,
,Stringbusiness,StringcityCode){
super();
this.location=location;
this.formatted_address=formatted_address;
this.addressComponent=addressComponent;
this.business=business;
this.cityCode=cityCode;
}
(){
returnthis.addressComponent;
}
publicStringgetBusiness(){
returnthis.business;
}
publicStringgetCityCode(){
returnthis.cityCode;
}
publicStringgetFormatted_address(){
returnthis.formatted_address;
}
publicLocationgetLocation(){
returnthis.location;
}
publicvoidsetAddressComponent(){
this.addressComponent=addressComponent;
}
publicvoidsetBusiness(Stringbusiness){
this.business=business;
}
publicvoidsetCityCode(StringcityCode){
this.cityCode=cityCode;
}
publicvoidsetFormatted_address(Stringformatted_address){
this.formatted_address=formatted_address;
}
publicvoidsetLocation(Locationlocation){
this.location=location;
}
}
publicclassLocation{
Stringlng;
Stringlat;
publicLocation(){
}
publicLocation(Stringlng,Stringlat){
this.lng=lng;
this.lat=lat;
}
publicStringgetLat(){
returnthis.lat;
}
publicStringgetLng(){
returnthis.lng;
}
publicvoidsetLat(Stringlat){
this.lat=lat;
}
publicvoidsetLng(Stringlng){
this.lng=lng;
}
@Override
publicStringtoString(){
return"Location[lng="+this.lng+",lat="+this.lat+"]";
}
}
publicclassAddressComponent{
Stringcity;
Stringdistrict;
Stringprovince;
Stringstreet;
Stringstreet_number;
publicAddressComponent(){
super();
//TODOAuto-generatedconstructorstub
}
publicAddressComponent(Stringcity,Stringdistrict,Stringprovince,
Stringstreet,Stringstreet_number){
super();
this.city=city;
this.district=district;
this.province=province;
this.street=street;
this.street_number=street_number;
}
publicStringgetCity(){
returnthis.city;
}
publicStringgetDistrict(){
returnthis.district;
}
publicStringgetProvince(){
returnthis.province;
}
publicStringgetStreet(){
returnthis.street;
}
publicStringgetStreet_number(){
returnthis.street_number;
}
publicvoidsetCity(Stringcity){
this.city=city;
}
publicvoidsetDistrict(Stringdistrict){
this.district=district;
}
publicvoidsetProvince(Stringprovince){
this.province=province;
}
publicvoidsetStreet(Stringstreet){
this.street=street;
}
publicvoidsetStreet_number(Stringstreet_number){
this.street_number=street_number;
}
@Override
publicStringtoString(){
return"AddressComponent[city="+this.city+",district="
+this.district+",province="+this.province+",street="
+this.street+",street_number="+this.street_number+"]";
}
}
測試:
jsonString ( 目標json數據,已經在最上面寫好的)
System.out.println("jsonString:"+jsonString);
Gsongson=newGson();
ResultfromJson=gson.fromJson(jsonString.toString(),Result.class);
System.out.println("******************************************");
System.out.println(fromJson);
結果:
jsonString:{"status":0,"result":{"location":{"lng":103.98964143811,"lat":30.586643130352},"formatted_address":"四川省成都市雙流縣北一街154","business":"簇橋,金花橋","addressComponent":{"city":"成都市","district":"雙流縣","province":"四川省","street":"北一街","street_number":"154"},"cityCode":75}}
*******************************************
Result[status=0,result=ResultDetail[location=Location[lng=103.98964143811,lat=30.586643130352],formatted_address=四川省成都市雙流縣北一街154,addressComponent=AddressComponent[city=成都市,district=雙流縣,province=四川省,street=北一街,street_number=154],business=簇橋,金花橋,cityCode=75]]
可見,jsonString已經成功的被轉換成了對應的javaBean
步驟3 : 總結.說明
Gson可以很輕松的實現javaBean和jsonString之間的互轉.只需要明白json如何定義.剩下的就非常簡單了.
Ⅵ json解析,java該如何解析啊
一、 JSON (JavaScript Object Notation)一種簡單的數據格式,比xml更輕巧。
Json建構於兩種結構:
1、「名稱/值」對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。 如:
{
「name」:」jackson」,
「age」:100
}
2、值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)如:
{
「students」:
[
{「name」:」jackson」,「age」:100},
{「name」:」michael」,」age」:51}
]
}
二、java解析JSON步驟
A、伺服器端將數據轉換成json字元串
首先、伺服器端項目要導入json的jar包和json所依賴的jar包至builtPath路徑下(這些可以到JSON-lib官網下載:http://json-lib.sourceforge.net/)
然後將數據轉為json字元串,核心函數是:
public static String createJsonString(String key, Object value)
{
JSONObject jsonObject = new JSONObject();
jsonObject.put(key, value);
return jsonObject.toString();
}
B、客戶端將json字元串轉換為相應的javaBean
1、客戶端獲取json字元串(因為android項目中已經集成了json的jar包所以這里無需導入)
public class HttpUtil
{
public static String getJsonContent(String urlStr)
{
try
{// 獲取HttpURLConnection連接對象
URL url = new URL(urlStr);
HttpURLConnection httpConn = (HttpURLConnection) url
.openConnection();
// 設置連接屬性
httpConn.setConnectTimeout(3000);
httpConn.setDoInput(true);
httpConn.setRequestMethod("GET");
// 獲取相應碼
int respCode = httpConn.getResponseCode();
if (respCode == 200)
{
return ConvertStream2Json(httpConn.getInputStream());
}
}
catch (MalformedURLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
private static String ConvertStream2Json(InputStream inputStream)
{
String jsonStr = "";
// ByteArrayOutputStream相當於內存輸出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
// 將輸入流轉移到內存輸出流中
try
{
while ((len = inputStream.read(buffer, 0, buffer.length)) != -1)
{
out.write(buffer, 0, len);
}
// 將內存流轉換為字元串
jsonStr = new String(out.toByteArray());
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonStr;
}
}
2、獲取javaBean
public static Person getPerson(String jsonStr)
{
Person person = new Person();
try
{// 將json字元串轉換為json對象
JSONObject jsonObj = new JSONObject(jsonStr);
// 得到指定json key對象的value對象
JSONObject personObj = jsonObj.getJSONObject("person");
// 獲取之對象的所有屬性
person.setId(personObj.getInt("id"));
person.setName(personObj.getString("name"));
person.setAddress(personObj.getString("address"));
}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return person;
}
public static List<Person> getPersons(String jsonStr)
{
List<Person> list = new ArrayList<Person>();
JSONObject jsonObj;
try
{// 將json字元串轉換為json對象
jsonObj = new JSONObject(jsonStr);
// 得到指定json key對象的value對象
JSONArray personList = jsonObj.getJSONArray("persons");
// 遍歷jsonArray
for (int i = 0; i < personList.length(); i++)
{
// 獲取每一個json對象
JSONObject jsonItem = personList.getJSONObject(i);
// 獲取每一個json對象的值
Person person = new Person();
person.setId(jsonItem.getInt("id"));
person.setName(jsonItem.getString("name"));
person.setAddress(jsonItem.getString("address"));
list.add(person);
}
}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
Ⅶ java如何解析文件夾下的json文件
json文件?你說的是裡面的內容是json格式的文件吧?
個人比較習慣用import net.sf.json.*;來解析json字元串。。
JSONArray array=JSONArray.fromObject(object);可以把一個object轉換成json格式的數組,當然了,符合標準的json格式數組的字元串也能夠用它解析。
JSONObject obj=JSONObject.fromObject(object);可以把一個object轉換成json格式的對象,當然了,符合標準的json格式的字元串也能夠用它解析。
在JSONObject中,調用getString("keyName")就能夠得到對應的value了
Ⅷ 從客戶端封裝JSON數據,如何非同步傳送到Java後台Action解析。
1.將list tojson或toGson ,它有支持的架包的 就可以轉換成json格式
2.傳數據到action中 直接獲取數據後將其封裝成變數就可以傳到action了,重點在url 裡面寫的提交也可以帶上參數。你這個方法也行。
3.因為一般你通過數據專到action里的數據,不是一個變數參數,就是一個實體,一般很少有是集合的。你通過action的url 時就可以將其封裝到實體里,也可以直接用一個變數去接收。
在這個裡面將json數據轉換成其它格式時,你要知道其中的數據列是怎麼樣的,排列方式是什麼樣的,然後去解析,再通過循環或者其它方式轉換成其它類型的數據。其中的【】{} 所在位置,與意義。你可以通過某一些工具,其實可以看到json裡面的數據結構,知道了它就很好解決了。