Home / Android-Entwicklung / Das Android Arsenal – JSON

Das Android Arsenal – JSON

Sweep Gson fügt Gson (Un-) Wrapping-Funktionalität hinzu, ohne das vorhandene Verhalten zu ändern.

Download

Gradle:

 Dependencies {
  Implementierung  ' io.saeid.sweep: sweep-gson: 1.0.0 ' 

} 

Verwendung

 GsonBuilder  (). withSweep (). create () 

Wenn Sie weitere erweiterte Funktionen benötigen:

 GsonBuilder 
 (). WithSweep {
      defaultWrapper  =  ...  //  optional 

      defaultUnwrapper  =  ...  //  optional 

      Haken  =  ...  //  optional 

} .create () 

SweepWrapper

Verwenden Sie die Annotation @SweepWrapper um das Objekt während der Serialisierung mit dem gewünschten Wert zu umbrechen.

 @SweepWrapper  ( ")  "
)
 Daten  Klasse  Anfrage  ( Wert  Name :  String ) 

Die Ausgabe nach Serialisierung der obigen Klasse:

 {
   " Anfrage " 
: {
     " Name " :  " your_value " 


}
} 

Verschachtelter Zeilenumbruch

@SweepWrapper unterstützt auch verschachtelten Zeilenumbruch mit Punkt als Trennzeichen:

Wenn Sie beispielsweise den Wert im obigen Beispiel durch @SweepWrapper ("request.data") ersetzen ) Es wird erzeugen:

 {
   " Anfrage " 
: {
     " Daten " 
: {
       " Name " :  " your_value " 



}
  }
} 

Custom / Default Wrapping

Wenn Sie den Klassennamen als Wrapper-Wert verwenden möchten, können Sie einfach @SweepWrapper (USE_CLASS_NAME_WRAPPER) .

USE_CLASS_NAME_WRAPPER [1945EinreserviertesWortdas @SweepWrapper zwingt, den Klassennamen (dekapitalisierte Version) als Wrapper-Namen zu verwenden.

Beispiel:

 @SweepWrapper  ( USE_CLASS_NAME_WRAPER 
 )
 Daten  Klasse  Anforderung  ( Wert  Name :  Zeichenfolge ) 
 {
   " Anfrage " 
: {
     " Name " :  " your_value " 


}
} 

Sie können auch den Wert @SweepWrapper zur Laufzeit definieren, indem Sie defaultWrapper überschreiben.

 GsonBuilder 
 (). WithSweep {
      defaultWrapper  =  Objekt :  DefaultWrapper 
 {
          überschreiben  Spaß  < T >  wrapWith  ( value :  T ) : [19659021]  String?
 {
             return  " request. $ USE_CLASS_NAME_WRAPPER " 



}
      }
} .create () 

Hinweis: Standardmäßig wechselt @SweepWrapper zum defaultWrapper wenn Sie keinen Wert übergeben.

SweepUnwrapper

Verwenden Sie die Annotation @SweepUnwrapper um das Objekt während der Deserialisierung mit dem gewünschten Wert zu entpacken. Im Gegensatz zu @SweepWrapper funktioniert @SweepUnwrapper nur mit dem Stammobjekt.

 {
   " Antwort " 
: {
     " Name " :  " your_value " 


}
} 

Der obige JSON kann beispielsweise für die folgende Klasse deserialisiert werden:

 @SweepWrapper  ( " Antwort " 
)
 Daten  Klasse  Antwort  ( Wert  Name :  Zeichenfolge ) 

Verschachteltes Auspacken

@SweepUnwrapper ebenfalls Unterstützt verschachteltes Auspacken mit Punkt als Trennzeichen:

Wenn Sie beispielsweise den Wert im obigen Beispiel durch @SweepUnwrapper ("response.body") ersetzen, kann er vom folgenden JSON extrahiert werden: [19659023] {
   " Antwort " : {
     " Körper " : {
       " Name " : " your_value "
}
  }
}

Benutzerdefiniertes / Standard-Auspacken

Wie @SweepWrapper unterstützt es USE_CLASS_NAME_UNWRAPPER .

Sie können auch den @SweepUnwrapper -Wert bei durch Überschreiben von defaultUnwrapper .

 GsonBuilder 
 (). withSweep {
      defaultUnwrapper  =  Objekt :  DefaultUnwrapper 
 {
         Überschreiben  Spaß  < T >  Auspacken mit  ( Typ :  Klasse  < T  ]>) :  Zeichenfolge?  =  null 



      }
      
       überschreiben  Spaß  erzwingen  () :  Boolean  =  true 



} .create () 

@SweepUnwrapper unterstützt auch den Force-Modus. Dies bedeutet, dass alle Objekte entpackt werden, wenn sie während der Deserialisierung nicht mit @SweepUnwrapper kommentiert werden.

] Wenn Sie den Force-Modus für einen bestimmten Typ deaktivieren möchten, können Sie einfach null übergeben.

Hinweis: Standardmäßig wechselt @SweepUnwrapper zu defaultUnwrapper Wenn Sie keinen Wert übergeben.

startsWith / endsWith

@SweepUnwrapper unterstützt auch einen einfachen Start- / End-With-Regex.

  • @SweepUnwrapper ("* Antwort ") Es wird alles ausgepackt, was mit Antwort endet, z singleResponse
  • @SweepUnwrapper ("response *") Es wird alles entpackt, was mit response beginnt, z. responseValue

Hooks

Sweep Gson ermöglicht das Hinzufügen eines Objekts zum Root-Element vor der Serialisierung durch Überschreiben der Methode addToRoot von Hooks : [19659010] GsonBuilder (). WithSweep {
      
      Haken = Objekt : Haken {
           überschreiben Spaß < T > addToRoot ( value : T ) : [19659020] Pair < String Beliebig >? {
              Rückgabe Paar ( " Eigenschaften " Eigenschaften (...)
          }
      }
} .create ()

Es werden Eigenschaften zu den mit SweepWrapper kommentierten Stammklassen hinzugefügt.

 {
    " Eigenschaften " : 
 {
        ... 


   }
    ... 

} 

Beispiel

Angenommen, Sie haben eine REST-API mit der folgenden Anforderungs- / Antwortvorlage:

 //  Anforderung 


{
     " Eigenschaften " : 
 {
         " Gerät " :  " Benutzergerät " 


},
     " Anfrage " : 
 {
         " request_type " : 




 {
   }
    }
}

 //  Antwort 


{
     " Antwort " : 
 {
          " response_typeReply " : 


 {
         }
    }
} 

Erstellen Sie zuerst unsere DTOs:

 @SweepWrapper 
 Daten  Klasse  Login  ( val  Benutzername :  String  val  password :  String 

)

 @SweepUnwrapper 
 data  class  User  ( val  name :  String ) 

Dann erstellen wir unsere Gson-Instanz using withSweep :

 GsonBuilder 
 (). withSweep {
         //  Weist sweep gson an, jedes Objekt zu entpacken, das der Antwort entspricht. * Reply` 

        defaultUnwrapper  =  Objekt :  DefaultUnwrapper 
 {
             Überschreiben  Spaß  < T >  Auspacken mit  ( Typ :  Klasse  < T  ]>) :  String?  =  " Antwort " 
 Override  Fun  Force 

 () :  Boolescher Wert  =  true 


        }
         // Weist sweep gson an, jedes annotierte Objekt mit `request 'zu umschließen. [the class name of that object] `

        defaultWrapper  =  Objekt :  DefaultWrapper 
 {
             überschreiben  Spaß  < T >  wrapWith  ( value :  T ) : [19659021]  String =  " Anfrage. $ USE_CLASS_NAME_WRAPPER " 


}
         //  füge der Wurzel unserer Objekte während der Serialisierung Eigenschaften hinzu 

        Haken  =  Objekt :  Haken 
 {
             überschreiben  Spaß  < T >  addToRoot  ( value :  T ) : [19659020]  Pair < String  Beliebig 
>? {
                 return  Pair  (

" properties " Properties ( " Android " [19659018] ))             }         }     } .create ()

Und jetzt das Ergebnis:

 gson.toJson ( Login  ( " admin "  " admin  "
))
 //  wird gedruckt 
 //  {"properties": {"device": "Android"}, "request": {"login": {"userName": "admin", "password": "admin"}} } 



gson.fromJson < User > ( ""  {"response": {"userReply": {"name": "admin"}} "" [19659018]  Benutzer  ::  Klasse 
 .java)
 //  wird gedruckt 
 //  Benutzer (Name = Administrator) 

Einschränkungen

  • Entpacken Entpackt nur das Stammelement.

Beispielsweise können Sie Folgendes nicht deserialisieren JSON

 {
   " Elternteil " 
: {
     " root " 
: {
       " Name " :  " Sweep " 



}
  }
} 

bis

 Daten  Klasse  Wurzel  ( val  Elternteil :  Elternteil 

)

 Daten  Klasse  Elternteil  ( Wert  Kind :  Kind 

)

 @SweepUnwrapper  ( " root " 
)
 data  class  Child  ( val  name :  String ) 
  • Unwrapper ignoriert Geschwisterelemente beim Deserialisieren.

Beispielsweise ist Version nach der Deserialisierung null, aber Kind wird deserialisiert.

 {
   " Elternteil " 
: {
     " root " 
: {
       " Name " :  " Sweep " 



}
  }
} 
 @SweepUnwrapper  ( " root " 
)
 Daten  Klasse  Wurzel  ( Wert  Version :  Zeichenfolge  Wert  Kind : [19659020]  Kind

)

 Daten  Klasse  Kind  ( Wert  Name :  Zeichenfolge ) 
  • addToRoot funktioniert nur, wenn die Stammklasse ist kommentiert mit SweepWrapper .
  • Im Gegensatz zu SweepUnwrapper ist für SweepWrapper .

.

About AndroidWeltEditor

Check Also

Low-Power Sleep Tracking on Android

Posted by Nick Grayson, Product Manager Android works best when it helps developers create apps …

Leave a Reply

Your email address will not be published. Required fields are marked *