【问题标题】:Own Firebase deserializer自己的 Firebase 反序列化器
【发布时间】:2017-01-11 20:49:32
【问题描述】:

我有不想重写的旧代码,我正在使用 gson 和 io.gsonfire 将特殊 json 映射到我的 java 类。我只想将 Datasnapshot 转换为 json 字符串,这样我就可以使用我的其他实现。我将无法使用 Datasnapshot.getValue(SomeClass.class) 因为我的转换器很特殊。

public class BlockTypeSelector {

public Gson createGson(){

    GsonFireBuilder builder = new GsonFireBuilder()
    .registerTypeSelector(AbstractPhrase.class, new TypeSelector<AbstractPhrase>() {
        @Override
        public Class<? extends AbstractPhrase> getClassForElement( JsonElement readElement) {
             JsonElement element = readElement.getAsJsonObject().get("dotted");
             if( element != null ){
                  return DottedFillPhrase.class;
             }

            return Phrase.class;
        }

    })
    .registerTypeSelector(AbstractParagraph.class, new TypeSelector<AbstractParagraph>() {
        @Override
        public Class<? extends AbstractParagraph> getClassForElement( JsonElement readElement) {
             JsonElement element = readElement.getAsJsonObject().get("cells");
             if( element != null ){
                  return TableParagraph.class;
             }

             element = readElement.getAsJsonObject().get("padding");
             if( element != null ){
                return TableCell.class;
             }

             element = readElement.getAsJsonObject().get("fill");
             if( element != null ){
                return FillParagraph.class;
             }

            return Paragraph.class;
        }

    })
    .registerTypeSelector(BaseElement.class, new TypeSelector<BaseElement>() {
        @Override
        public Class<? extends BaseElement> getClassForElement(JsonElement readElement) {
            JsonElement element = readElement.getAsJsonObject().get("type");
            if( element == null ){
                throw new JsonSyntaxException( "You must have a type in block" );
            }
            String kind = element.getAsString();
            if(kind.equals("LINE")){
                return Line.class;
            }else if(kind.equals("BLOCK")) {
                return Block.class; 
            }else if(kind.equals("IMAGE")) {
                return Image.class; 
            }else if(kind.equals("QR")) {
                return QRCode.class; 
            }else if(kind.equals("BARCODE")) {
                return Barcode.class; 
            } else {
                return null; //returning null will trigger Gson's default behavior
            }
        }
    });

    return builder.createGson();


}

}

所以任何关于如何制作这样的东西的指针

{ key = 787878, value = {document={pages={0={blocks={0={position={3=60.1, 2=50, 1=28.95, 0=25.6}, useAscender=true, type=BLOCK, border={thickness=0.1}}}}}, name=22323}} }

转json字符串?我担心的是 3:60 之类的。我怎么知道它是一个数组而不是 "3" : "60" json?

【问题讨论】:

    标签: java firebase firebase-realtime-database


    【解决方案1】:

    看来您已经在使用 Gson 来解析 JSON。您还可以使用 Gson 到 serialize JSON 以及通过使用自己的 API 挖掘 DataSnapshot 并使用它来填充一些 JSON 输出。

    如果您这样做,我怀疑这与编写代码以导航 DataSnapshot 并直接转换您的数据模型所花费的精力大致相同,而且它的运行速度比转换要快得多它是 JSON,然后是你的模型。

    【讨论】:

    • DataSnapshot 无法让我序列化我的对象。
    • 您必须使用它的 API(我链接到的)来获取其中的值。 getChildren()、child() 和 value() 都是你需要的。
    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2019-04-08
    • 2017-12-08
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多