如何在gson

时间:2016-07-26 10:49:51

标签: java android json gson auto-value

我最近遇到了使用AutoValues(GSON)扩展来加速解析json数据的概念。我们确实发现它解析了我们的json两倍。

但是我错过了一点,使用AutoValues时的数据集是不可变的,但是我们的数据集/模型通常与json类似,并且不需要映射器。

因此,如果我想在我的模型类中设置单个数据元素,这看起来不可行(因为我们只有抽象的getter而没有setter。有没有解决这个问题的办法,或者我错过了一个观点。 我将使用AutoValue使用我们所做的示例代码和类似的语法来解释。

所以我们通常会编写类似

的代码
public class ModelClass{
    private String aValue;
    private String anotherValue;
    public String getAValue(){
        return this.aValue;
    }
    public void setAValue(String aValue){
        this.aValue = aValue;
    }
    public String getAnotherValue(){
        return this.anotherValue;
    }
    public String setAnotherValue(anotherValue){
        this.anotherValue = anotherValue
    }
}

public class ViewClass{
     public void foo(){
          String json = {"aValue":"This is a sample string", "anotherValue": "this is another string"};
          ModelClass model = gson.fromJson(json, ModelClass.class);
          model.getAValue();
          model.setAValue("this is a new value"); // and we can set individual element ModelClass.aValue


     }
}

但在使用自动值时,模型类的结构更改为

  @AutoValue public abstract class AutoValueModel{
       public abstract String bValue();
       public abstract String otherValue();

       public static AutoValueModel(String bValue, String otherValue){
           return new AutoValue_AutoValueModel(bValue, otherValue);
       }
  }

//现在您可以看到AutoValueModel结构不包含任何setter如果我可能只想更改bValue(基于用户操作,即使我知道AutoValues背后的基本前提是它们是不可变的)并继续在代码的其他部分使用。然后使用完全相同的AutoValueModel序列化json。 或者我应该使用AutoValue技术反序列化,然后使用我可以对数据集执行更改的映射模型? (如果我使用这种技术,我会失去使用AutoValue获得的速度的好处吗?)

还从我学习AutoValues的地方参考:

An Introduction to AutoValue

FASTER JSON DESERIALIZATION WITH AUTOVALUE GSON EXTENSION

1 个答案:

答案 0 :(得分:1)

  

如果我可能只想更改bValue ...并继续在代码的其他部分使用该怎么办?

如果您想更新@AutoValue d类的特定值,则需要使用@AutoValue.Builder创建一个具有更新值的新类,因为Vincent Dubedout在他的博客上回复了您的评论

您将拥有一个带有@AutoValue.Builder注释的静态构建器类的类,如this one,当您需要具有更新值的类时,您将使用此构建器创建一个新类一个类只更新了某个值。

https://github.com/google/auto/blob/master/value/userguide/builders.md#autovalue-with-builders

我希望这会有所帮助。