json sax like parser 관련 참고자료입니다.

json sax like parser 관련 참고자료입니다.

간단히 검색해서 나온결과는 총 3가지가 존재합니다.
1.jackson
//http://wiki.fasterxml.com/JacksonInFiveMinutes#Full_Data_Binding_.28POJO.29_Example

2.gson
//https://sites.google.com/site/gson/streaming

3.json-simple
//https://github.com/fangyidong/json-simple

3가지중에서 json-simple은 내부코드를 보면 전체를 메모리에 로딩하고 사용할때 배열순회방식을 사용하여 
메모리를 많이 사용하는 모듈로 판단됩니다.

사용방식상 gson이 좀더 깔끔했습니다.

읽을때
public List<Message> readJsonStream(InputStream in) throws IOException {
	JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
	List<Message> messages = new ArrayList<Message>();
	reader.beginArray();
	while (reader.hasNext()) {
		Message message = gson.fromJson(reader, Message.class);
		messages.add(message);
	}
	reader.endArray();
	reader.close();
	return messages;
}

쓸때

public void writeJsonStream(OutputStream out, List<Message> messages) throws IOException {
	JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
	writer.setIndent("  ");
	writer.beginArray();
	for (Message message : messages) {
		gson.toJson(message, Message.class, writer);
	}
	writer.endArray();
	writer.close();
}

	
jackson 방식


읽을때
JsonFactory f = new JsonFactory();
JsonParser jp = f.createParser(new File("user.json"));
User user = new User();
jp.nextToken(); // will return JsonToken.START_OBJECT (verify?)
while (jp.nextToken() == JsonToken.FIELD_NAME) {
  String fieldname = jp.getCurrentName();
  jp.nextToken(); // move to value, or START_OBJECT/START_ARRAY
  if ("name".equals(fieldname)) { // contains an object
    Name name = new Name();
    while (jp.nextToken() != JsonToken.END_OBJECT) {
      String namefield = jp.getCurrentName();
      jp.nextToken(); // move to value
      if ("first".equals(namefield)) {
        name.setFirst(jp.getText());
      } else if ("last".equals(namefield)) {
        name.setLast(jp.getText());
      } else {
        throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");
      }
    }
    user.setName(name);
  } else if ("gender".equals(fieldname)) {
    user.setGender(User.Gender.valueOf(jp.getText()));
  } else if ("verified".equals(fieldname)) {
    user.setVerified(jp.getCurrentToken() == JsonToken.VALUE_TRUE);
  } else if ("userImage".equals(fieldname)) {
    user.setUserImage(jp.getBinaryValue());
  } else {
    throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");
  }
}
jp.close(); // ensure resources get cleaned up timely and properly

쓸때

JsonFactory f = new JsonFactory();
JsonGenerator g = f.createGenerator(new File("user.json"));

g.writeStartObject();
g.writeObjectFieldStart("name");
g.writeStringField("first", "Joe");
g.writeStringField("last", "Sixpack");
g.writeEndObject(); // for field 'name'
g.writeStringField("gender", Gender.MALE);
g.writeBooleanField("verified", false);
g.writeFieldName("userImage"); // no 'writeBinaryField' (yet?)
byte[] binaryData = ...;
g.writeBinary(binaryData);
g.writeEndObject();
g.close(); // important: will force flushing of output, close underlying output stream