Gson JSON最大尺寸

时间:2016-04-19 11:02:04

标签: java json gson clob

我需要从Clob中提取一些数据并以JSON格式对其进行序列化。

Gson可以处理的最大尺寸是什么?

https://github.com/google/gson/blob/master/UserGuide.md我可以找到 "字符串:超过25MB的反序列化字符串没有任何问题"

上下文:我用..

ResultSet.getClob()
-> BufferedReader 
-> String singleLine 
-> StringBuilder 
-> String "jsonAttribute" to serialize

更详细:

try{

    StringBuilder sb = new StringBuilder();
    BufferedReader br = new BufferedReader( resultset.getClob(2).getCharacterStream() );
    String line;
    try{
        while ((line = br.readLine()) != null) {
           sb.append(line).append("\n");
        }
    }catch(IOException ee){
        // logger
        throw ee;
    }

    String jsonAttribute = sb.toString();

}catch(Exception xx){..}

注意:在我当前的代码中,限制是Integer.MAX_VALUE

我的解决方案将使用从数据库中检索的数据块。我想知道GSON可以处理的理论最大大小。我不会在接收方使用浏览器。

2 个答案:

答案 0 :(得分:2)

Gson没有施加任何限制。也没有任何已知的建筑限制。

我认为您将面临的主要问题是首先将数据加载到内存中。

我建议您在从数据库中读取JSON时使用Gson流API编写JSON。使用JsonWriter创建并流式传输JSON对象。

Reader reader = resultset.getClob(2).getCharacterStream();
JsonWriter jsonWriter = new JsonWriter(someOutputStream);
copyStream(reader, someOutputStream);

copyStream可能类似于

public static void copyStream(Reader istream, Writer ostream) throws IOException {
  char buffer[] = new char[2048];
  while (true) {
    int len = istream.read(buffer);
    if (len == -1)
      return;
    ostream.write(buffer, 0, len);
  }
}

答案 1 :(得分:1)

我确认@sargue回答。我尝试了以下测试,并使用分配给jvm的适当堆内存的魅力。

@Test
public void testGsonLimitss(){

    EntityHalConverter<HugeData> converter = new EntityHalConverter<>(HugeData.class);
    HugeData hugeData = new HugeData();
    converter.toJson( hugeData );
}

class HugeData implements HalResource {

    String big1, big2;

    public HugeData(){
        // big1 = StringUtils.repeat("X", 400000000); // 300 millions chars ~ approx 3 mb.  With  multibyte chars ..... 3.5 mb
        big2 = StringUtils.repeat("Y", Integer.MAX_VALUE-10);
    }
}

这是我使用的转换器(使用Halarious)..

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParseException;

import ch.halarious.core.HalResource;
import ch.halarious.core.HalSerializer;
import ch.halarious.core.HalDeserializer;
import ch.halarious.core.HalExclusionStrategy;

public class EntityHalConverter <T> {

    private Gson gson;
    private GsonBuilder builder;

    private Class<T> paramType;


    /* HalConverter<ProgrammeData> halConverter = new HalConverter<>(ProgrammeData.class);
    */
    public EntityHalConverter(Class<T> paramType) {
        builder = new GsonBuilder();
        builder.setExclusionStrategies(new HalExclusionStrategy());
        this.paramType = paramType;
    }


    /* String jsonResult = halConverter.toJson( programmeData );
    */
    public String toJson( T result ) throws JsonParseException{

        builder.registerTypeAdapter(HalResource.class, new HalSerializer());
        gson = builder.create();
        return gson.toJson(result, HalResource.class);
    }


    /* ProgrammeData pcsProg = halConverter.convert( jsonString );
    */
    public T fromJson( String json ) throws JsonParseException {

        builder.registerTypeAdapter( HalResource.class, new HalDeserializer(paramType) );
        gson = builder.create();
        return (T)gson.fromJson( json, HalResource.class );
    }

}