java json嵌套解析

sureballse 华中科技大学 学生  2016-06-16 10:44:40
如题
String value = "{{'startTime': {'l': '08:30', 'r': '09:00'},'endTime': {'l': '11:30', 'r': '12:00'}},{'startTime': {'l': '14:00', 'r': '14:30'},'endTime': {'l': '17:30', 'r': '18:00'}}}";
现在希望可以将其解析,小白一枚,搞了两天了。。。求助攻啊。。。。。
感激不尽
...全文
111 点赞 收藏 12
写回复
12 条回复
解开者 2016年06月16日
对楼上的补充:JSONObject会被解析为LinkedHashMap 此外很重要的一点:Jackson是可以识别泛型的!因此,通过合理组合带泛型的集合类,理论上可以表示任意多层嵌套的json对象,并通过一次read或write操作完成转换
回复 点赞
解开者 2016年06月16日
引用 4 楼 sureballse 的回复:
恩恩 确实是写错了 可是#3大神 我就是不是很懂解析的过程啊 我是建了一个类 period public class period { public Map<String,Object> startTime; public Map<String,Object> endTime; } 现在用 ObjectMapper mapper = new ObjectMapper(); mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); String value = "[{'startTime': {'l': '08:30', 'r': '09:00'},'endTime': {'l': '11:30', 'r': '12:00'}},{'startTime': {'l': '14:00', 'r': '14:30'},'endTime': {'l': '17:30', 'r': '18:00'}}]"; List<period> a = mapper.readValue(value, List.class); for (Iterator iter = a.iterator(); iter.hasNext();) { System.out.println(iter.next().get("startTime")); } 可以遍历出这个结果。。。 {startTime={l=08:30, r=09:00}, endTime={l=11:30, r=12:00}} {startTime={l=14:00, r=14:30}, endTime={l=17:30, r=18:00}} 应该是都是map类型 可是接下来我不会了啊。
Jackson解析是可以一步到位的,所有写代码时可以确定的json结构都可以定义成DTO(可以嵌套内部类) 如果不定义类,Jackson默认解析为LinkedHashMap 推荐用DTO,数据流转更清晰
class Period {
	Region startTime;
	Region endTime;
	private class Region {
		String l;
		String r;
	}
}
回复 点赞
sureballse 2016年06月16日
恩恩 确实是写错了 可是#3大神 我就是不是很懂解析的过程啊 我是建了一个类 period public class period { public Map<String,Object> startTime; public Map<String,Object> endTime; } 现在用 ObjectMapper mapper = new ObjectMapper(); mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); String value = "[{'startTime': {'l': '08:30', 'r': '09:00'},'endTime': {'l': '11:30', 'r': '12:00'}},{'startTime': {'l': '14:00', 'r': '14:30'},'endTime': {'l': '17:30', 'r': '18:00'}}]"; List<period> a = mapper.readValue(value, List.class); for (Iterator iter = a.iterator(); iter.hasNext();) { System.out.println(iter.next().get("startTime")); } 可以遍历出这个结果。。。 {startTime={l=08:30, r=09:00}, endTime={l=11:30, r=12:00}} {startTime={l=14:00, r=14:30}, endTime={l=17:30, r=18:00}} 应该是都是map类型 可是接下来我不会了啊。
回复 点赞
Akuma_lht 2016年06月16日
定义一个类Times 其中有属性 Time[] time Time类中有属性 StartTime startTime和EndTime endTime 然后这两个类里都有属性String l 和String r 注意量名和属性名必须一致否则无法注入。 然后把你接收到的字符串先转为jsonobject对象。接着再把对象转化为Times对象

JSONObject unitsJsonObject = JSONObject.fromObject(unitsMsg);//msg为接收到的json字符串
		
		Times times = (Times)JSONObject.toBean(unitsJsonObject, Times.class); //这个就是解析获得的对象
回复 点赞
我纯洁全身都纯洁 2016年06月16日
没试过, 不知道单引号行不行。
首先你这不是一个json格式的对象。
你这应该是个json格式的数组,最外层应该是中括号[]
你把代码稍微改改就行了
回复 点赞
qq_15915835 2016年06月16日
json字符串写错了吧。看那意思是jsonarry 应该是 “[{'startTime': {'l': '08:30', 'r': '09:00'},'endTime': {'l': '11:30', 'r': '12:00'}},{'startTime': {'l': '14:00', 'r': '14:30'},'endTime': {'l': '17:30', 'r': '18:00'}}]"
回复 点赞
解开者 2016年06月16日
我仍然推荐用Jackson,对于MVC模式来说可以完全用Model而不是Controller,并且可以无缝对接Spring都是竞争力。 解析json字符串得到的java对象,通过Jackson也能方便地重新格式化为json字符串。 用代码逻辑来解析数据始终不是什么好事,在数据结构变化的时候不得不同时修改耦合在业务逻辑中的解析逻辑,会造成维护压力。
import java.io.IOException;
import java.util.List;

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.type.JavaType;

public class JacksonTest {
	public static void main(String[] args) throws IOException {
		String s = "[{\"startTime\":{\"l\":\"08:30\",\"r\":\"09:00\"},\"endTime\":{\"l\":\"11:30\",\"r\":\"12:00\"}},{\"startTime\":{\"l\":\"14:00\",\"r\":\"14:30\"},\"endTime\": {\"l\":\"17:30\",\"r\":\"18:00\"}}]";
		ObjectMapper mapper = new ObjectMapper();
		JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, Period.class);
		List<Period> list = mapper.readValue(s, javaType);
		System.out.println(list);
		String t = new ObjectMapper().enable(SerializationConfig.Feature.INDENT_OUTPUT).writeValueAsString(list);
		System.out.println(t);
	}
}

class Period {
	public Region startTime;
	public Region endTime;

	public static class Region {
		public String l;
		public String r;

		@Override
		public String toString() {
			return String.format("Region [l=%s, r=%s]", l, r);
		}
	}

	@Override
	public String toString() {
		return String.format("Period [startTime=%s, endTime=%s]", startTime, endTime);
	}
}
输出如下: [Period [startTime=Region [l=08:30, r=09:00], endTime=Region [l=11:30, r=12:00]], Period [startTime=Region [l=14:00, r=14:30], endTime=Region [l=17:30, r=18:00]]] [ { "startTime" : { "l" : "08:30", "r" : "09:00" }, "endTime" : { "l" : "11:30", "r" : "12:00" } }, { "startTime" : { "l" : "14:00", "r" : "14:30" }, "endTime" : { "l" : "17:30", "r" : "18:00" } } ]
回复 点赞
sureballse 2016年06月16日
感谢各位~~~~~~~~~~~怎么不会针对某一楼进行回复呢
回复 点赞
sureballse 2016年06月16日
太感谢啦 太棒啦 还是我自己基础不好 真的十分感谢
回复 点赞
我纯洁全身都纯洁 2016年06月16日
7、8楼都可以 建议7楼
回复 点赞
我纯洁全身都纯洁 2016年06月16日

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
 
 
public class JSON {
    public static void main(String[] args) {
        String  s = "[{\"startTime\": {\"l\": \"08:30\", \"r\": \"09:00\"},\"endTime\": {\"l\": \"11:30\", \"r\": \"12:00\"}},{\"startTime\": {\"l\": \"14:00\", \"r\": \"14:30\"},\"endTime\": {\"l\": \"17:30\", \"r\": \"18:00\"}}]";
        JSONArray ja = JSONArray.fromObject(s);
        for (int i = 0; i <ja.size(); i++) {
            JSONObject jo = JSONObject.fromObject(ja.get(i));
            Been startTimeBeen = (Been)JSONObject.toBean(jo.getJSONObject("startTime"), Been.class);
            Been endTimeBeen = (Been)JSONObject.toBean(jo.getJSONObject("endTime"), Been.class);
            System.out.println(startTimeBeen.l + startTimeBeen.r + endTimeBeen.l + endTimeBeen.r);
        }
    }
}



public class Been {
    	String l;
    	String r;
		public String getL() {
			return l;
		}
		public void setL(String l) {
			this.l = l;
		}
		public String getR() {
			return r;
		}
		public void setR(String r) {
			this.r = r;
		}
}

打印 08:3009:0011:3012:00 14:0014:3017:3018:00
回复 点赞
我纯洁全身都纯洁 2016年06月16日

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;


public class JSON {
	public static void main(String[] args) {
		String  s = "[{\"startTime\": {\"l\": \"08:30\", \"r\": \"09:00\"},\"endTime\": {\"l\": \"11:30\", \"r\": \"12:00\"}},{\"startTime\": {\"l\": \"14:00\", \"r\": \"14:30\"},\"endTime\": {\"l\": \"17:30\", \"r\": \"18:00\"}}]";
		JSONArray ja = JSONArray.fromObject(s);
		for (int i = 0; i <ja.size(); i++) {
			JSONObject jo = JSONObject.fromObject(ja.get(i));
			JSONObject startTime = jo.getJSONObject("startTime");
			JSONObject endTime = jo.getJSONObject("endTime");
			System.out.println("startTime.l=" + startTime.getString("l") + "startTime.r=" + startTime.getString("r") + "endTime.l=" + endTime.getString("l") + "endTime.r=" + endTime.getString("r"));
		}
	}
}
//打印 startTime.l=08:30startTime.r=09:00 endTime.l=11:30endTime.r=12:00 startTime.l=14:00startTime.r=14:30 endTime.l=17:30endTime.r=18:00
回复 点赞
发动态
发帖子
Web 开发
创建于2007-09-28

5.2w+

社区成员

34.1w+

社区内容

Java Web 开发
社区公告
暂无公告