`

解析json

    博客分类:
  • Json
阅读更多
在网络上找了下解析json格式文件的源代码,好久都没找到。 比如得到一个json格式的任意文件,便可以知道其内部的格式和内容。于是便写了一个。下面是自己写的解析内容。

1.如果有不对的地方,还希望大家能帮忙指正。
2.如果有更好的解析json格式的代码,希望能分享下,给下链接,多谢。^_^


注:在代码中需要json源文件的支持,是为了来判断提供的字符串是否是json格式的字符串,下载地址是:http://www.json.org/java/index.html

package com.utils;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * 1. what are in the stack:
 * 		two parts: 	the name of jsonObject or jsonArray, the sign after: [ or {. Such as: data[, observation{.
 * 					the reason for the sign after put into the stack  is to know it is a jsonObject or jsonArray.
 * 					what are in the stack are the parent jsonItem that the children will be put into.
 * 2. the result.
 * 		you will get one JSONItem object. It is the "outest" JSONObject.
 * 		you can get others by its children and its children's children.
 * @author yuanbo han
 *
 */
public class JSONParser {
	public static final String icons_regex = "[\\{\\}\\[\\]]";
	public static final String signs_split_regex = "[:,\\{\\}\\[\\]]";
	public static final String all_sign_regex_for_remove = "[:,\"\\{\\}\\[\\]]";
	public static final String attribute_regex = "[,\\{\\}\\[\\]]";
	
	private String jsonString;
	private Object container;

	public JSONParser(String jsonString) {
		super();
		this.jsonString = jsonString;
	}
	
	public JSONItem getOutestJSONItem(){
		if(!this.isJsonFormat(jsonString)){
			JSONItem item = new JSONItem();
			item.setName("format error");
			item.setType(null);
			item.setChildren(null);
			item.setAttributes(null);
			return item;
		}
		
		List<JSONItem> items = new ArrayList<JSONItem>();
		JSONItem outest = new JSONItem();
		outest.setName("outest");
		outest.setType(JSONItem.OBJECT);
		items.add(outest);//put a outest JSONItem. No name for it, so I set outest.
		
		Stack<String> stack = new Stack<String>();
		Matcher matcher = Pattern.compile(signs_split_regex).matcher(jsonString);
		
		
		int last_sign_index = 0;// in order to find what I want, two indexes help to locate where it is. This is the first one.
		JSONItem current = outest;
		while(matcher.find()){
			int sign_index = matcher.start();// in order to find what I want, two indexes help to locate where it is. This is the second one.
			String sign = matcher.group();
			if(!sign.trim().equals(",")){
				if(sign.trim().equals(":")){//the outer jsonObject or jsonArray. The string before the colon is the name. Or the attributes.
					if(getCodeBefore(jsonString,sign_index).equals("\"")){
						String code_after = getCodeAfter(jsonString,sign_index);//{ , [ or other things.
						if(code_after.matches(icons_regex)){//{ or [. jsonArray or jsonObject
							String name_origin = jsonString.substring(last_sign_index, sign_index).trim();
							String name = removeSigns(name_origin);
							JSONItem item = new JSONItem();
							item.setName(name);
							if(isJsonObjectItem(code_after)){
								item.setType(JSONItem.OBJECT);
							}else{
								item.setType(JSONItem.ARRAY);
							}
							items.add(item);
							current = item;// current jsonItem. This is for the attribute part. to get whose attribute it is.
							
							String parentName = removeSigns(stack.peek());
							JSONItem parent = getJSONItem(items,parentName);
							if(parent != null){
								parent.addChild(item);
							}
							
							stack.push(name+code_after);
						}else if(isAttribute(jsonString,sign_index)){// attributes
							String key_origin = jsonString.substring(last_sign_index, sign_index);
							String key = removeSigns(key_origin);
							String value = getAttributeValueAfter(jsonString,sign_index);
							current.addAttribute(key,value);
						}
					}
				}else{// "[" or "]" or "{" or "}".
					if(!stack.empty()){
						String header = stack.peek();
						if(isPair(header,sign)){
							stack.pop();
						}else{
							if(!getCodeBefore(jsonString,sign_index).equals(":")){// inner child or array. no name.
								JSONItem item = new JSONItem();
								if(isJsonObjectItem(sign)){
									item.setType(JSONItem.OBJECT);
								}else{
									item.setType(JSONItem.ARRAY);
								}
								items.add(item);
								current = item;
								
								String parentName = removeSigns(header);
								JSONItem parent = getJSONItem(items,parentName);
								if(parent != null){
									parent.addChild(item);
								}
								
								stack.push(sign);
							}
						}
					}else{// the first time
						stack.push("outest" + sign);
					}
				}
			}
			
			last_sign_index = sign_index;// if the sign is ",", just remember its position. It is the meaning of the sign "," in the process. To ensure that the String between the last_sign_index and the sign_index does not contain ",".
		}
		JSONItem result = getJSONItem(items,"outest");;
		processJSONItem(result);
		return result;
	}
	
	/**
	 * to give a name to each child of jsonArray.
	 * @param item
	 */
	private void processJSONItem(JSONItem item){
		if(item.getChildren() != null && item.getChildren().size() > 0){
			int count = 0;
			for(JSONItem child : item.getChildren()){
				if(child.getName().trim().equals("")){
					child.setName(item.getName() + "_" +count + "");
					count++;
				}
				processJSONItem(child);
			}
		}
	}
	
	public static String removeSigns(String origin_name){
		if(origin_name != null){
			String name = origin_name.replaceAll(all_sign_regex_for_remove, "").trim();
			return name;
		}
		return null;
	}
	
	/**
	 * to find the jsonItem of the give name.
	 * null if not exist.
	 * @param JSONItems
	 * @param name
	 * @return
	 */
	public static JSONItem getJSONItem(List<JSONItem> JSONItems, String name){
		if(JSONItems != null && name != null && !name.trim().equals("")){
			for(JSONItem item : JSONItems){
				if(item.getName().trim().equals(name.trim())){
					return item;
				}
			}
		}
		return null;
	}
	
	public static boolean isJsonObjectItem(String sign){
		if(sign.trim().equals("{")){
			return true;
		}
		return false;
	}

	public static boolean isPair(String former, String latter){
		if(former.contains("{") && latter.contains("}") 
				|| former.contains("}") && latter.contains("{") 
				|| former.contains("[") && latter.contains("]") 
				|| former.contains("]") && latter.contains("[")){
			return true;
		}
		return false;
	}
	
	/**
	 * Get the one char just right before the index in the content. But the one char does not match "\\s". 
	 * @param content
	 * @param index
	 * @return
	 */
	public static String getCodeBefore(String content, int index){
		for(int i=index-1;i>=0;i--){
			String sign = String.valueOf(content.charAt(i));
			if(!sign.matches("\\s")){
				return sign;
			}
		}
		return null;
	}
	

	/**
	 * Get the one char just right after the index in the content. But the one char does not match "\\s".
	 * @param content
	 * @param index
	 * @return
	 */
	public static String getCodeAfter(String content, int index){
		for(int i=index+1;i<content.length();i++){
			String sign = String.valueOf(content.charAt(i));
			if(!sign.matches("\\s")){
				return sign;
			}
		}
		return null;
	}
	
	/**
	 * Get the one char just right before the index in the content. But the one char does not match "\\w" and the one char is not blank.
	 * @param content
	 * @param index
	 * @return
	 */
	public static String getSignBefore(String content, int index){
		for(int i=index-1;i>=0;i--){
			String sign = String.valueOf(content.charAt(i));
			if(!sign.equals(" ") && !sign.matches("\\w")){
				return sign;
			}
		}
		return null;
	}
	
	/**
	 * Get the one char just right after the index in the content. But the one char does not match "\\w" and the one char is not blank.
	 * @param content
	 * @param index
	 * @return
	 */
	public static String getSignAfter(String content, int index){
		for(int i=index+1;i<content.length();i++){
			String sign = String.valueOf(content.charAt(i));
			if(!sign.equals(" ") && !sign.matches("\\w")){
				return sign;
			}
		}
		return null;
	}
	
	/**
	 * the first_quote_bofore_index and second_quote_bofore_index is to find the name of the attribute.
	 * code_before is to ensure that the sign before the the attribute name is "," or "[" or "{".
	 * @param content
	 * @param index
	 * @return
	 */
	public static boolean isAttribute(String content, int index){
		int first_quote_bofore_index = content.lastIndexOf("\"", index);
		if(first_quote_bofore_index == -1){
			return false;
		}
		int second_quote_bofore_index = content.lastIndexOf("\"",first_quote_bofore_index - 1);
		if(second_quote_bofore_index == -1){
			return false;
		}
		String code_before = getCodeBefore(content,second_quote_bofore_index);
		
		if(code_before.matches(attribute_regex)){
			return true;
		}
		return false;
	}
	
	/**
	 * the value of the attribute are object, string, or number
	 * so some are quoted, but some are not.
	 * @param content
	 * @param index
	 * @return
	 */
	public static String getAttributeValueAfter(String content, int index){
		String result = "";
		String icon = getSignAfter(content,index);
		if(icon.equals("\"")){
			int former_quote_index = content.indexOf("\"", index);
			int latter_quote_index = content.indexOf("\"", former_quote_index + 1);
			result = content.substring(former_quote_index + 1, latter_quote_index);
		}else{
			int icon_index = content.indexOf(icon, index + 1);
			result = content.substring(index+1, icon_index);
		}
		
		return result;
	}

	public boolean isJsonFormat(String string){
		try {
			new JSONObject(string);
		} catch (JSONException e) {
			return false;
		}
		return true;
	}
	
	/**
	 * from the root jsonItem.
	 * @param root
	 */
	public static void printJSONItem(JSONItem root){
		if(root.getName().trim().equals("")){
			System.out.println("inner child, " + root.getType());
		}else{
			System.out.println(root.getName() + ", " + root.getType());
		}
		if(root.getAttributes().size() > 0){
			for(String key : root.getAttributes().keySet()){
				System.out.println("\t key:" + key + ", value:" + root.getAttributes().get(key));
			}
		}
		if(root.getChildren().size() > 0){
			for(JSONItem item : root.getChildren()){
				printJSONItem(item);
			}
		}
	}
	

	/**
	 * loop to find the container of the given name in the jsonString
	 * @param container
	 * @param outest
	 * @param name
	 * @return
	 */
	private void getContainer(Object container, JSONItem outest, String name){
		if(outest != null && container != null && name != null){
			if(name.trim().equals("")){
				this.container = outest;
			}else if(name.equals(outest.getName())){
				this.container = container;
			}else{
				try {
					List<JSONItem> children = outest.getChildren();
					if(children != null && children.size() > 0){
						for(int i=0;i<children.size();i++){
							
							JSONObject jo = null;
							JSONArray ja = null;
							if(container instanceof JSONObject){
								jo = (JSONObject)container;
							}else if(container instanceof JSONArray){
								ja = (JSONArray)container;
							}
							
							JSONItem child = children.get(i);
							String child_type = child.getType();
							String child_name = child.getName();
							if(jo != null){
								if(child_type.equals(JSONItem.ARRAY)){
									ja = jo.getJSONArray(child_name);
									getContainer(ja,child,name);
								}else if(child_type.equals(JSONItem.OBJECT)){
									jo = jo.getJSONObject(child_name);
									getContainer(jo,child,name);
								}
							}else if(ja != null){
								if(child_type.equals(JSONItem.ARRAY)){
									ja = ja.getJSONArray(i);
									getContainer(ja,child,name);
								}else if(child_type.equals(JSONItem.OBJECT)){
									jo = ja.getJSONObject(i);
									getContainer(jo,child,name);
								}
							}
						}
					}
				} catch (JSONException e) {
					
				}
			}
		}
	}
	

	public Object getContainerObject(Object container, JSONItem outest, String name) {
		this.getContainer(container, outest, name);
		return this.container;
	}

	public void setContainer(Object container) {
		this.container = container;
	}
	
	public String getJsonString() {
		return jsonString;
	}

	public void setJsonString(String jsonString) {
		this.jsonString = jsonString;
	}
	
	public static void main(String[] args) throws Exception{
		String jsonString = FileUtil.getFileContent("c:\\json.txt");
		JSONParser parser = new JSONParser(jsonString);
		
		JSONItem outest = parser.getOutestJSONItem();
		JSONObject jo = new JSONObject(jsonString);
		String name = "data_5";
		
		Object result = parser.getContainerObject(jo, outest, name);
		
		JSONArray ja_container = null;
		JSONObject jo_container = null;
		if(result instanceof JSONObject){
			jo_container = (JSONObject)result;
		}else if(result instanceof JSONArray){
			ja_container = (JSONArray)result;
		}
		
		if(ja_container != null){
			System.out.println(ja_container.length());
		}else if(jo_container != null){
			System.out.println(jo_container.getInt("sort_order"));
		}
		
	}
}




package com.utils;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class JSONItem {
	public static final String ARRAY = "arr";
	public static final String OBJECT = "obj";
	private String name = "";// name
	private String type = "";// array or object
	private Map<String,String> attributes = new LinkedHashMap<String,String>();
	private List<JSONItem> children = new ArrayList<JSONItem>();
	
	
	public JSONItem() {
		super();
	}

	public JSONItem(String name, String type) {
		super();
		this.name = name;
		this.type = type;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public Map<String, String> getAttributes() {
		return attributes;
	}

	public void setAttributes(Map<String, String> attributes) {
		this.attributes = attributes;
	}
	
	public void addAttribute(String key, String value){
		this.attributes.put(key, value);
	}

	public List<JSONItem> getChildren() {
		return children;
	}

	public void setChildren(List<JSONItem> children) {
		this.children = children;
	}
	
	public void addChild(JSONItem child){
		this.children.add(child);
	}
	
	

	@Override
	public boolean equals(Object obj) {
		if(obj == null){
			return false;
		}
		
		if(obj instanceof JSONItem){
			JSONItem item = (JSONItem)obj;
			if(item.getName().equals(this.name) && item.getType().equals(this.name)){
				return true;
			}
		}
		
		return false;
	}

	@Override
	public String toString() {
		String result = "";
		result += ("name: " + name + ", ");
		result += ("type: " + type + ", ");
		result += ("attributes: " + attributes.toString() + ", ");
		result += ("children size: " + children.size());
		
		return result;
	}
	
	
}




下面是最近经常处理的json格式的文件。地址为:http://www.bom.gov.au/fwo/IDS60801/IDS60801.95655.json

{
	"observations": {
		"notice": [
			{
				"copyright": "Copyright Commonwealth of Australia 2010, Bureau of Meteorology. For more information see: http://www.bom.gov.au/other/copyright.shtml http://www.bom.gov.au/other/disclaimer.shtml",
				"copyright_url": "http://www.bom.gov.au/other/copyright.shtml",
				"disclaimer_url": "http://www.bom.gov.au/other/disclaimer.shtml",
				"feedback_url": "http://www.bom.gov.au/other/feedback"
			}
		],
		"header": [
			{
				"refresh_message": "Issued at  6:35 pm CST Wednesday 11 August 2010",
				"ID": "IDS60801",
				"main_ID": "IDS60800",
				"name": "Nonning",
				"state_time_zone": "SA",
				"time_zone": "CST",
				"product_name": "Weather Observations",
				"state": "South Australia"
			}
		],
		"data": [
			{
				"sort_order": 0,
				"wmo": 95655,
				"name": "Nonning",
				"history_product": "IDS60801",
				"local_date_time": "11/03:00pm",
				"local_date_time_full": "20100811150000",
				"air_temp": 15.5,
				"apparent_t": 12.2,
				"cloud": "Partly cloudy",
				"cloud_base_m": null,
				"cloud_oktas": 4,
				"cloud_type": "-",
				"cloud_type_id": 30,
				"delta_t": 4.5,
				"dewpt": 6.3,
				"gust_kmh": null,
				"gust_kt": null,
				"lat": -32.5,
				"lon": 136.5,
				"press_msl": null,
				"press_qnh": null,
				"press_tend": "-",
				"rain_trace": "0.0",
				"rel_hum": 54,
				"sea_state": "-",
				"swell_dir_worded": "-",
				"swell_height": "-",
				"swell_length": "-",
				"vis_km": "50",
				"weather": "Fine",
				"wind_dir": "SW",
				"wind_spd_kmh": 13,
				"wind_spd_kt": 7
			},
			{
				"sort_order": 1,
				"wmo": 95655,
				"name": "Nonning",
				"history_product": "IDS60801",
				"local_date_time": "11/09:00am",
				"local_date_time_full": "20100811090000",
				"air_temp": 9.5,
				"apparent_t": 7.8,
				"cloud": "Clear",
				"cloud_base_m": 2500,
				"cloud_oktas": 0,
				"cloud_type": "-",
				"cloud_type_id": null,
				"delta_t": 1.0,
				"dewpt": 7.4,
				"gust_kmh": null,
				"gust_kt": null,
				"lat": -32.5,
				"lon": 136.5,
				"press_msl": null,
				"press_qnh": null,
				"press_tend": "-",
				"rain_trace": "0.4",
				"rel_hum": 87,
				"sea_state": "-",
				"swell_dir_worded": "-",
				"swell_height": "-",
				"swell_length": "-",
				"vis_km": "40",
				"weather": "Fine",
				"wind_dir": "SW",
				"wind_spd_kmh": 6,
				"wind_spd_kt": 3
			},
			{
				"sort_order": 2,
				"wmo": 95655,
				"name": "Nonning",
				"history_product": "IDS60801",
				"local_date_time": "11/06:00am",
				"local_date_time_full": "20100811060000",
				"air_temp": 7.0,
				"apparent_t": 5.1,
				"cloud": "Clear",
				"cloud_base_m": 2500,
				"cloud_oktas": 0,
				"cloud_type": "-",
				"cloud_type_id": null,
				"delta_t": 1.0,
				"dewpt": 4.7,
				"gust_kmh": null,
				"gust_kt": null,
				"lat": -32.5,
				"lon": 136.5,
				"press_msl": null,
				"press_qnh": null,
				"press_tend": "-",
				"rain_trace": "-",
				"rel_hum": 85,
				"sea_state": "-",
				"swell_dir_worded": "-",
				"swell_height": "-",
				"swell_length": "-",
				"vis_km": "50",
				"weather": "Fine",
				"wind_dir": "SSW",
				"wind_spd_kmh": 4,
				"wind_spd_kt": 2
			},
			{
				"sort_order": 3,
				"wmo": 95655,
				"name": "Nonning",
				"history_product": "IDS60801",
				"local_date_time": "10/03:00pm",
				"local_date_time_full": "20100810150000",
				"air_temp": 12.0,
				"apparent_t": 10.4,
				"cloud": "Mostly cloudy",
				"cloud_base_m": null,
				"cloud_oktas": 7,
				"cloud_type": "-",
				"cloud_type_id": 30,
				"delta_t": 2.0,
				"dewpt": 7.9,
				"gust_kmh": null,
				"gust_kt": null,
				"lat": -32.5,
				"lon": 136.5,
				"press_msl": null,
				"press_qnh": null,
				"press_tend": "-",
				"rain_trace": "0.4",
				"rel_hum": 76,
				"sea_state": "-",
				"swell_dir_worded": "-",
				"swell_height": "-",
				"swell_length": "-",
				"vis_km": "40",
				"weather": "Fine",
				"wind_dir": "SSW",
				"wind_spd_kmh": 6,
				"wind_spd_kt": 3
			},
			{
				"sort_order": 4,
				"wmo": 95655,
				"name": "Nonning",
				"history_product": "IDS60801",
				"local_date_time": "10/09:00am",
				"local_date_time_full": "20100810090000",
				"air_temp": 8.0,
				"apparent_t": 6.9,
				"cloud": "Mostly cloudy",
				"cloud_base_m": null,
				"cloud_oktas": 7,
				"cloud_type": "-",
				"cloud_type_id": 30,
				"delta_t": 0.5,
				"dewpt": 6.9,
				"gust_kmh": null,
				"gust_kt": null,
				"lat": -32.5,
				"lon": 136.5,
				"press_msl": null,
				"press_qnh": null,
				"press_tend": "-",
				"rain_trace": "4.0",
				"rel_hum": 93,
				"sea_state": "-",
				"swell_dir_worded": "-",
				"swell_height": "-",
				"swell_length": "-",
				"vis_km": "50",
				"weather": "Fine",
				"wind_dir": "SW",
				"wind_spd_kmh": 2,
				"wind_spd_kt": 1
			},
			{
				"sort_order": 5,
				"wmo": 95655,
				"name": "Nonning",
				"history_product": "IDS60801",
				"local_date_time": "10/06:00am",
				"local_date_time_full": "20100810060000",
				"air_temp": 6.5,
				"apparent_t": 4.1,
				"cloud": "Cloudy",
				"cloud_base_m": null,
				"cloud_oktas": 8,
				"cloud_type": "-",
				"cloud_type_id": 30,
				"delta_t": 1.0,
				"dewpt": 4.2,
				"gust_kmh": null,
				"gust_kt": null,
				"lat": -32.5,
				"lon": 136.5,
				"press_msl": null,
				"press_qnh": null,
				"press_tend": "-",
				"rain_trace": "-",
				"rel_hum": 85,
				"sea_state": "-",
				"swell_dir_worded": "-",
				"swell_height": "-",
				"swell_length": "-",
				"vis_km": "40",
				"weather": "Fine",
				"wind_dir": "SW",
				"wind_spd_kmh": 6,
				"wind_spd_kt": 3
			},
			{
				"sort_order": 6,
				"wmo": 95655,
				"name": "Nonning",
				"history_product": "IDS60801",
				"local_date_time": "09/03:00pm",
				"local_date_time_full": "20100809150000",
				"air_temp": 10.0,
				"apparent_t": 7.8,
				"cloud": "Cloudy",
				"cloud_base_m": null,
				"cloud_oktas": 8,
				"cloud_type": "-",
				"cloud_type_id": 30,
				"delta_t": 2.1,
				"dewpt": 5.4,
				"gust_kmh": null,
				"gust_kt": null,
				"lat": -32.5,
				"lon": 136.5,
				"press_msl": null,
				"press_qnh": null,
				"press_tend": "-",
				"rain_trace": "0.0",
				"rel_hum": 73,
				"sea_state": "-",
				"swell_dir_worded": "-",
				"swell_height": "-",
				"swell_length": "-",
				"vis_km": "30",
				"weather": "Fine",
				"wind_dir": "NE",
				"wind_spd_kmh": 6,
				"wind_spd_kt": 3
			},
			{
				"sort_order": 7,
				"wmo": 95655,
				"name": "Nonning",
				"history_product": "IDS60801",
				"local_date_time": "09/09:00am",
				"local_date_time_full": "20100809090000",
				"air_temp": 9.5,
				"apparent_t": 9.2,
				"cloud": "Partly cloudy",
				"cloud_base_m": null,
				"cloud_oktas": 5,
				"cloud_type": "-",
				"cloud_type_id": 30,
				"delta_t": 0.5,
				"dewpt": 8.5,
				"gust_kmh": null,
				"gust_kt": null,
				"lat": -32.5,
				"lon": 136.5,
				"press_msl": null,
				"press_qnh": null,
				"press_tend": "-",
				"rain_trace": "3.0",
				"rel_hum": 93,
				"sea_state": "-",
				"swell_dir_worded": "-",
				"swell_height": "-",
				"swell_length": "-",
				"vis_km": "40",
				"weather": "Fine",
				"wind_dir": "CALM",
				"wind_spd_kmh": 0,
				"wind_spd_kt": 0
			},
			{
				"sort_order": 8,
				"wmo": 95655,
				"name": "Nonning",
				"history_product": "IDS60801",
				"local_date_time": "09/06:00am",
				"local_date_time_full": "20100809060000",
				"air_temp": 3.5,
				"apparent_t": 2.1,
				"cloud": "Mostly cloudy",
				"cloud_base_m": null,
				"cloud_oktas": 6,
				"cloud_type": "-",
				"cloud_type_id": 30,
				"delta_t": 0.0,
				"dewpt": 3.5,
				"gust_kmh": null,
				"gust_kt": null,
				"lat": -32.5,
				"lon": 136.5,
				"press_msl": null,
				"press_qnh": null,
				"press_tend": "-",
				"rain_trace": "-",
				"rel_hum": 100,
				"sea_state": "-",
				"swell_dir_worded": "-",
				"swell_height": "-",
				"swell_length": "-",
				"vis_km": "50",
				"weather": "Fine",
				"wind_dir": "CALM",
				"wind_spd_kmh": 0,
				"wind_spd_kt": 0
			}
		]
	}
}
分享到:
评论

相关推荐

    PB解析json,解析JSON案例,解析jsondemo

    标题中的“PB解析json,解析JSON案例,解析jsondemo”表明了本文主要关注的是PowerBuilder(简称PB)如何处理JSON数据。在现代软件开发中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,...

    json paser 属于idea插件 用于解析json

    json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于...

    kettle解析json串

    根据提供的信息,我们可以深入探讨如何在Kettle中解析JSON串,并连接数据库进行数据处理。本文将详细介绍使用Java库解析JSON的基本方法以及如何在Kettle环境中实现这一过程。 ### Kettle与JSON解析概述 #### 1. **...

    PB调用http、api,PB解析json.zip

    PB调用http、api,PB解析json; PB调用http、api,PB解析json; PB调用http、api,PB解析json; PB调用http、api,PB解析json; PB调用http、api,PB解析json; PB调用http、api,PB解析json; PB调用http、api,PB解析...

    PB9生成和解析JSON

    在PB9中处理JSON数据,通常涉及到两个关键步骤:生成JSON字符串和解析JSON字符串。 一、生成JSON 在PB9中生成JSON,你需要将数据结构转换为JSON格式。这通常通过编写函数或者利用第三方库来实现。PB9本身并不内置...

    java 解析 json文件 java 解析 json文件

    Java解析JSON文件是Java开发中常见的一项任务,特别是在与Web服务交互或处理API响应时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁和易于阅读及编写的特点,被广泛应用于网络数据传输...

    VB解析JSON案例

    本案例“VB解析JSON”就是针对这一需求,提供了一种在VB环境中解析JSON数据的方法。 首先,我们需要引入一个VB.NET库,如Newtonsoft.Json,它提供了丰富的功能来序列化和反序列化JSON。在Visual Studio中,可以通过...

    java中解析json字符串

    本文将深入探讨如何在Java中解析JSON字符串,以满足后端处理前端传递的数据需求。 首先,理解JSON的基本结构至关重要。JSON格式通常包含键值对,可以是对象(用花括号 `{}` 包裹)或数组(用方括号 `[]` 包裹)。...

    PB调用http apiPB解析json

    3. **PB解析JSON**:PowerBuilder提供了一些内置或第三方库来解析JSON数据,例如使用pbjson、jsonobject等类库。解析JSON数据时,首先需要将响应内容转换为字符串,然后使用JSON解析器将字符串转换为数据结构,如数...

    pb解析json工具

    标题提到的"pb解析json工具"是一种专门用于处理protobuf(简称pb)与JSON两种数据格式相互转换的工具。这两种格式各有优势,广泛应用于不同场景。 首先,让我们了解一下JSON(JavaScript Object Notation)。JSON是...

    C++解析json字符串

    本主题将深入探讨如何在C++中解析JSON字符串,主要涉及以下几个知识点: 1. **JSON基本结构**:JSON数据由键值对组成,键用双引号包围,值可以是字符串、数字、布尔值、数组、对象或null。例如:`{"name": "John", ...

    VB6解析json类库

    标题中的“VB6解析json类库”指的是一个用于Visual Basic 6(VB6)环境的JSON解析工具。JSON,全称JavaScript Object Notation,是一种轻量级的数据交换格式,广泛应用于Web服务和应用程序之间的数据传输。这个类库...

    Sql Server解析Json

    ### SQL Server 解析 JSON 字符串方法详解 随着 Web 应用和服务的广泛采用,JSON 成为了一种非常流行的轻量级数据交换格式。在 SQL Server 中处理 JSON 数据变得日益重要,尤其是对于那些需要从非结构化数据源提取...

    C#像java一样优雅的解析JSON数据

    C#的一个解析JSON的工具类,像java一样优雅的解析JSON数据,包含有JSONObject和JSONArray对象。 JSONObject json = new JSONObject(); json.Put("sex", "男"); json.Put("age", 123); json.Put("name", "张三"); ...

    Gson解析json数据

    在本文中,我们将深入探讨如何使用Gson解析JSON数据,包括处理简单JSON和复杂的JSON结构。 首先,我们要了解JSON的基本概念。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,...

    JsonSQL:用SQL语句解析JSON文件

    **JsonSQL: SQL语句解析JSON文件** 在大数据处理和Web应用中,JSON(JavaScript Object Notation)格式已经成为数据交换的常见格式。然而,对于习惯使用SQL查询关系型数据库的人来说,处理JSON数据可能会觉得不太...

    ASP解析JSON方法

    在ASP中解析JSON数据可以帮助我们从服务器接收或向服务器发送结构化数据。下面我们将详细探讨ASP解析JSON的方法及其对比。 1. ASP内置对象:JSON对象 ASP.NET 2.0及以上版本提供了内置的System.Web.Script....

    C# 解析json格式数据为IList

    C#中解析JSON通常使用的是Json.NET库,这是一个非常流行且功能强大的开源库,可以方便地进行JSON序列化和反序列化。如果你还没有安装,可以通过NuGet包管理器添加Json.NET到你的项目中。 使用Json.NET解析JSON为...

    WinformC#解析Json和使用范例

    在winform中解析Json字符串,只需要引用dll,即可解析json成相应的对象,非常方便。 public void GetJson(string sNu) { string sUrl = "******"; WebClient client = new WebClient(); client.Credentials = ...

    Powerbuilder解析json半成品

    【PowerBuilder解析JSON半成品】 在IT行业中,PowerBuilder(PB)是一款强大的应用程序开发工具,尤其在企业级应用开发中有着广泛的应用。它以其独特的DataWindow控件和面向对象的编程方式深受开发者喜爱。然而,...

Global site tag (gtag.js) - Google Analytics