2017-06-19 7 views
0

Existe-t-il un moyen de sérialiser un objet général dans Json et de désérialiser Json dans l'objet?
Si l'objet est une entité, je peux utiliser Jackson 2 lib pour atteindre cet objectif.
Mais si l'objet est une classe générale, comment puis-je faire cela?comment sérialiser un objet général dans Json et désérialiser Json dans l'objet dans Java

Par exemple, j'aimerais sérialisation com.datastax.driver.core.querybuilder.Update JSON et enregistrez-le DB, puis la recherche et de la désérialisation pour objet Update, utilisez finalement comme l'argument de com.datastax.driver.core.Session.execute(Statement) à execuate.

Est-il possible de reproduire l'objet Update?

COMPLEMENT:

Mon véritable but est de stocker Update puis récupérer et exécuter. J'ai donc pensé que je pouvais l'enregistrer comme JSON String puis l'extraire et le désérialiser dans l'instance Update originale et l'exécuter. Si ce n'est pas un bon moyen, comment puis-je stocker Update puis le récupérer et l'exécuter?
Bien que je puisse stocker le text query de Update et le récupérer et exécuter le text query, d'autres informations dans Update peuvent perdre, comme ConsistencyLevel.

Répondre

0

Il suffit de convertir le QueryBuilder.update en chaîne à l'aide toString() méthode

Si vous souhaitez stocker, récupérer et exécuter la requête QueryBuilder.update, vous n'avez pas sérialisé et désérialisé dans JSON.

String query = QueryBuilder.update("exp").with(QueryBuilder.set("data", "This is a test data")).toString(); 
//Now you can store the text query directly to cassandra 
//And retrieve the text query 
session.execute(query); //Execute the query 

Voici le code de toString()

@Override 
public String toString() { 
    try { 
     if (forceNoValues) 
      return getQueryString(); 
     // 1) try first with all values inlined (will not work if some values require custom codecs, 
     // or if the required codecs are registered in a different CodecRegistry instance than the default one) 
     return maybeAddSemicolon(buildQueryString(null, CodecRegistry.DEFAULT_INSTANCE)).toString(); 
    } catch (RuntimeException e1) { 
     // 2) try next with bind markers for all values to avoid usage of custom codecs 
     try { 
      return maybeAddSemicolon(buildQueryString(new ArrayList<Object>(), CodecRegistry.DEFAULT_INSTANCE)).toString(); 
     } catch (RuntimeException e2) { 
      // Ugly but we have absolutely no context to get the registry from 
      return String.format("built query (could not generate with default codec registry: %s)", e2.getMessage()); 
     } 
    } 
} 

Vous pouvez voir que c'est le retour de la chaîne de requête réelle

+0

Oui, je veux stocker, récupérer et exécuter la requête 'com.datastax.driver.core.querybuilder.Update'. Vous voulez dire que l'utilisation de la méthode 'toString()' peut obtenir la bonne requête de texte et l'exécuter directement? Etes-vous sûr que cela est correct en ce qui concerne l'opération de mise à jour ** complexe **? Je ne sais pas exactement ce que fait la méthode 'toString()'. Le code source est un peu diffcult pour moi. – niaomingjian

+0

Bien que je puisse obtenir la requête de texte, je perds peut-être d'autres informations dans 'Update'. – niaomingjian

+0

@niaomingjian Mise à jour de la réponse 'code toString()' ajouté. Vous pouvez voir qu'il renvoie la chaîne de requête réelle. –

0

pire des cas, vous pouvez toujours regarder dans la création de votre propre code sérialiseur personnalisé (de).

Voir here ou there pour plus de détails. Signification: vous pouvez vous intéresser à l'implémentation de la classe que vous avez l'intention de "sérialiser"; puis écrivez le code qui fonctionne pour cette implémentation. Le principal inconvénient lorsque vous faites cela pour un code tiers est: vous devez maintenant garder une trace des changements apportés à ce code tiers; comme des changements à cette mise à jour classe par exemple pourrait facilement casser votre code de sérialiseur (de) personnalisé.

+0

Mon vrai but est de stocker 'update' puis récupérer et l'exécuter. Je me demande donc si je peux utiliser le format JSON pour le stocker. Existe-t-il d'autres moyens de le faire? – niaomingjian

+0

Je vous ai donné une entrée qui décrit comment stocker des objets de classes arbitraires. Je ne comprends vraiment pas votre point. Il n'y a pas de magie ici. * Vous devez * regarder dans l'implémentation de la classe que vous avez l'intention de sérialiser, puis écrire du code. La seule alternative que je peux penser si: Google gson fonctionne en utilisant la réflexion, donc il n'a pas besoin des méthodes getter/setter que Jackson attend. Mais ensuite, on dirait que vous êtes surchargé de toute façon. Enfin: vous trouvez toutes les réponses qui valent la peine de "répéter" votre question, mais aucune d'entre elles n'est assez bonne pour un upvote? Très motivant ... – GhostCat

0

org.json offre une API simple qui manipule json. Il existe une méthode qui crée un objet JSONObject d'une instance d'une classe en fonction de son accesseur. Par exemple:

public class MyClass{ 
    private int id; 
    private String name, 

    public MyClass(int id_, String name_) { 
     this.id = id_; 
     this.name = name_; 
    } 

    public int getId() { return this.id; } 
    public int getName() { return this.name; } 

    //Create a JSONObject with a key-value for each getter of your class 
    public JSONObject toJson(){ 
     return new JSONObject(this); 
    } 
} 

Ensuite, dans votre code:

MyClass obj = new MyClass(1, "doe"); 
JSONObject json = obj.toJson(); 
System.out.println(json.toString()); 
// -> print : {"id":1,"name":"doe"} 

L'API fournit également differents analyseur, et vous pouvez coder un constructeur de votre classe avec un JSONObject fourni:

public MyClass(JSONObject json){ 
    this.id= json.getInt("id"); 
    this.name= json.getString("name"); 
} 

Docteur doc .: org.json official doc

+0

Mon but réel est de stocker 'Update', puis de le récupérer et de l'exécuter. Et 'Update' est le code de la 3ème partie, pas le mien. – niaomingjian

+0

Votre objet 'Update' contient-il des getters? Si c'est le cas, ma méthode fonctionne toujours. – Asew