首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JSON应该如何存储如下所示的值

JSON应该如何存储如下所示的值
EN

Stack Overflow用户
提问于 2017-02-17 18:39:04
回答 3查看 74关注 0票数 1

我想将Json值存储到下面的数组中。

如果只有一个事件,

代码语言:javascript
运行
复制
private static final String[] Eventname = {"Wedding"}
private static final String[][] Bid= {{"Studio 1"}}
private static final String[][] location= {{"Ernakulam"}}

如果有多个事件和多个投标人,

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
[
  {
    "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值并将其存储在上面的数组中呢?

EN

回答 3

Stack Overflow用户

发布于 2017-02-17 18:52:57

java中有多个json解析库。

例如,您可以使用javax.json。

在这种情况下,您可以这样做

代码语言:javascript
运行
复制
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。我会建议您创建适当的类来代表事件,地点和招标。它最终会让你的生活变得更轻松。

票数 1
EN

Stack Overflow用户

发布于 2017-02-17 19:01:38

如果您需要,请尝试此操作

代码语言:javascript
运行
复制
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类

代码语言:javascript
运行
复制
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;


 }
}
票数 1
EN

Stack Overflow用户

发布于 2017-02-17 19:19:39

使用Jackson,您可以为您的JSON编写自己的反序列化程序,并按您的意愿阅读它:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
  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能够为您完成所有工作。它将帮助你获得更清晰的代码,每个节点都有单独的实例,并且不会在一个数组中混合所有的对象,这看起来像是糟糕的设计。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42295753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档