我想将Json值存储到下面的数组中。
如果只有一个事件,
private static final String[] Eventname = {"Wedding"}
private static final String[][] Bid= {{"Studio 1"}}
private static final String[][] location= {{"Ernakulam"}}如果有多个事件和多个投标人,
private static final String[] Eventname = {"Wedding","Funeral"};
private static final String[][] Bid={{"Studio 1","Studio 2","Studio 3"},
{"Studio 1","Studio 2","Studio 3"}};
private static final String[][] location= {{"Ernakulam"},{"Kollam"}}我为例如:创建了一个json:
[
{
"Event": "Wedding",
"Studios": [
"Studio 1","Studio 2"
],
"Location": ["Ernakulam","Bangalore"]
},
{
"Event": "Birthday",
"Studios": [
"Studio 1"
],
"Location": ["Ernakulam"]
},
{
"Event": "Engagement",
"Studios": [
"Studio 1","Studio 2","Studio 2"
],
"Location": ["Ernakulam","Bangalore","Angamaly"]
}
]但是我如何获得这个json值并将其存储在上面的数组中呢?
发布于 2017-02-17 18:52:57
java中有多个json解析库。
例如,您可以使用javax.json。
在这种情况下,您可以这样做
try(JsonReader jsonReader = Json.createReader(new StringReader(yourJsonString))){
JsonArray arr = jsonReader.readArray();
... run through the entries in arr here and fill your arrays accordingly ...
}但我应该注意到,您试图创建的结构毫无意义,而且非常不像java。我会建议您创建适当的类来代表事件,地点和招标。它最终会让你的生活变得更轻松。
发布于 2017-02-17 19:01:38
如果您需要,请尝试此操作
public class Test {
private static final String[] EventName = new String[50];
private static final String[][] Bid = new String[50][50];
private static final String[][] location= new String[50][50];
public static void main(String[] args) throws ParseException {
String sampleJSON = "[\n" +
" {\n" +
" \"Event\": \"Wedding\",\n" +
" \"Studios\": [\n" +
" \"Studio 1\",\"Studio 2\"\n" +
" ],\n" +
" \"EventObject\": [\"Ernakulam\",\"Bangalore\"]\n" +
" },\n" +
" {\n" +
" \"Event\": \"Birthday\",\n" +
" \"Studios\": [\n" +
" \"Studio 1\"\n" +
" ],\n" +
" \"EventObject\": [\"Ernakulam\"]\n" +
"\n" +
" },\n" +
" {\n" +
" \"Event\": \"Engagement\",\n" +
" \"Studios\": [\n" +
" \"Studio 1\",\"Studio 2\",\"Studio 2\"\n" +
" ],\n" +
" \"EventObject\": [\"Ernakulam\",\"Bangalore\",\"Angamaly\"]\n" +
" }\n" +
"]";
Gson gson = new Gson();
ArrayList<EventObject> eventObjectArrayList = gson.fromJson(sampleJSON, new TypeToken<List<EventObject>>(){}.getType());
for (int i = 0; i < eventObjectArrayList.size(); i++) {
EventName[i] = eventObjectArrayList.get(i).getEvent();
for (int j = 0; j < eventObjectArrayList.get(i).getStudios().size(); j++) {
Bid[i][j] = eventObjectArrayList.get(i).getStudios().get(j);
}
for (int k = 0; k < eventObjectArrayList.get(i).getLocation().size(); k++) {
location[i][k] = eventObjectArrayList.get(i).getLocation().get(k);
}
}
}
}您需要GSON jar com.google.code.gson:gson:2.2.4,将其导入到项目中,或者将jar作为库添加到项目中。
这是您的EventObject类
public class EventObject implements Serializable {
String Event;
ArrayList<String> Studios;
ArrayList<String> Location;
public EventObject() {
}
public String getEvent() {
return Event;
}
public void setEvent(String event) {
Event = event;
}
public ArrayList<String> getStudios() {
return Studios;
}
public void setStudios(ArrayList<String> studios) {
Studios = studios;
}
public ArrayList<String> getLocation() {
return Location;
}
public void setLocation(ArrayList<String> location) {
Location = location;
}
}发布于 2017-02-17 19:19:39
使用Jackson,您可以为您的JSON编写自己的反序列化程序,并按您的意愿阅读它:
public static class Events {
private final String[] event;
private final String[][] bid;
private final String[][] location;
public Events(String[] event, String[][] bid, String[][] location) {
this.event = event;
this.bid = bid;
this.location = location;
}
public String[] getEvent() {
return event;
}
public String[][] getBid() {
return bid;
}
public String[][] getLocation() {
return location;
}
}
private class EventsDeserializer extends StdDeserializer<Events> {
protected EventsDeserializer() {
super(Events.class);
}
@Override
public Events deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
ArrayNode arrayNode = p.readValueAsTree();
String[] events = new String[arrayNode.size()];
String[][] bid = new String[arrayNode.size()][0];
String[][] location = new String[arrayNode.size()][0];
for (int i = 0; i < arrayNode.size(); i++) {
JsonNode internalNode = arrayNode.get(i);
events[i] = internalNode.get("Event").asText();
bid[i] = convertToArray(internalNode.get("Studios"));
location[i] = convertToArray(internalNode.get("Location"));
}
return new Events(events, bid, location);
}
private String[] convertToArray(JsonNode childNode) {
String[] locations = new String[0];
if (childNode != null && childNode.isArray()) {
ArrayNode locationNodeArrayNode = (ArrayNode) childNode;
locations = new String[locationNodeArrayNode.size()];
for (int j = 0; j < locations.length; j++) {
locations[j] = locationNodeArrayNode.get(j).asText();
}
}
return locations;
}
}
@Test
public void test() throws Exception {
SimpleModule sm = new SimpleModule();
sm.addDeserializer(Events.class, new EventsDeserializer());
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(sm);
Events events = mapper.readValue(JSON, Events.class);
System.out.println(events);
}但我建议你让你的内部结构更接近原来的Json:
public static class Event {
@JsonProperty("Event")
private String event;
@JsonProperty("Studios")
private List<String> bid;
@JsonProperty("Location")
private List<String> location;
public String getEvent() {
return event;
}
public void setEvent(String event) {
this.event = event;
}
public List<String> getLocation() {
return location;
}
public void setLocation(List<String> location) {
this.location = location;
}
}
@Test
public void test() throws Exception {
ObjectMapper mapper = new ObjectMapper();
Event[] jsonEvent = mapper.readValue(JSON, Event[].class);
System.out.println(events);
}正如您所看到的,如果您提供适当的映射,Jackson能够为您完成所有工作。它将帮助你获得更清晰的代码,每个节点都有单独的实例,并且不会在一个数组中混合所有的对象,这看起来像是糟糕的设计。
https://stackoverflow.com/questions/42295753
复制相似问题