mappa oggetto nidificato json da mongodb a java


Sto ricevendo l'oggetto json sul mio mongodb con l'API virustotal Questo è il modo in cui un oggetto json memorizzato nell'oggetto mongodb assomiglia a:

{
"_id" : ObjectId("597cd2f871eac714388b2f7f"),
"results" : {
    "scans" : {
        "Bkav" : {
            "detected" : true,
            "version" : "1.3.0.8042",
            "result" : "W32.HfsAutoB.971A",
            "update" : "20160706"
        },
        "TotalDefense" : {
            "detected" : false,
            "version" : "37.1.62.1",
            "result" : null,
            "update" : "20160706"
        },
        "MicroWorld-eScan" : {
            "detected" : true,
            "version" : "12.0.250.0",
            "result" : "Packer.Expressor.B",
            "update" : "20160706"
        },
        "nProtect" : {
            "detected" : true,
            "version" : "2016-07-06.01",
            "result" : "Packer.Expressor.B",
            "update" : "20160706"
        },
        "ALYac" : {
            "detected" : false,
            "version" : "1.0.1.9",
            "result" : null,
            "update" : "20160706"
        },           
        "TrendMicro" : {
            "detected" : true,
            "version" : "9.740.0.1012",
            "result" : "TROJ_GEN.R047C0CAP16",
            "update" : "20160706"
        },
        "McAfee-GW-Edition" : {
            "detected" : true,
            "version" : "v2015",
            "result" : "BehavesLike.Win32.Flyagent.cc",
            "update" : "20160706"
        },
        "Sophos" : {
            "detected" : true,
            "version" : "4.98.0",
            "result" : "W32/Pidgeon-A",
            "update" : "20160706"
        },
        "Cyren" : {
            "detected" : true,
            "version" : "5.4.16.7",
            "result" : "W32/SysVenFak.A.gen!Eldorado",
            "update" : "20160706"
        },
        "Microsoft" : {
            "detected" : true,
            "version" : "1.1.12902.0",
            "result" : "Backdoor:Win32/Delf.SJ",
            "update" : "20160706"
        },
        "AegisLab" : {
            "detected" : true,
            "version" : "4.2",
            "result" : "Backdoor.W32.BlackHole.acx!c",
            "update" : "20160706"
        },            
        "Qihoo-360" : {
            "detected" : false,
            "version" : "1.0.0.1120",
            "result" : null,
            "update" : "20160706"
        }
    },
    "scan_id" : "2ad6e0aad0b40f152f234787daa4afb87538f3278f5c8f815d53ef46d5eea4ac-1467833095",
    "sha1" : "c5dcd5526ac5330ad1e9fad51488718329fdb697",
    "resource" : "0a60424e0967b6cfc172dac82e10a2fe",
    "response_code" : 1,
    "scan_date" : "2016-07-06 19:24:55",
    "permalink" : "https://www.virustotal.com/file/2ad6e0aad0b40f152f234787daa4afb87538f3278f5c8f815d53ef46d5eea4ac/analysis/1467833095/",
    "verbose_msg" : "Scan finished, information embedded",
    "total" : 54,
    "positives" : 41,
    "sha256" : "2ad6e0aad0b40f152f234787daa4afb87538f3278f5c8f815d53ef46d5eea4ac",
    "md5" : "0a60424e0967b6cfc172dac82e10a2fe"
},
"response_code" : 200
}

Come puoi vedere l'oggetto json è troppo complicato per ottenere solo un valore dato da, Questo è quello che ho provato finora:

MongoClient mongo = new MongoClient("localhost", 27017);
        MongoDatabase database1 = mongo.getDatabase(db);
        MongoCollection<Document> collection1 = database1.getCollection(col);
        try (MongoCursor<Document> cursor = collection1.find().iterator()){

            while (cursor.hasNext()){
                Document doc = cursor.next();
                List list = new ArrayList(doc.values());
                System.out.println(list.get(1));
            }

        }

Stavo pensando che forse c'è un modo per mappare tutto questo json a una classe java, il problema principale è con "scans" poiché ci sono molti scannor diversi e non è ottimizzato per creare un modello di classe java per ciascuno di essi, La mia domanda è come posso memorizzare direttamente i miei oggetti json su un oggetto java in modo da operare sui risultati restituiti.

Author: git1235, 2017-07-31

2 answers

È necessario creare due classi java per analizzare Json proveniente da Mongo, supponiamo che il nome della prima classe "CollectionReceived" Nome della seconda classe "Result" Nella classe CollectionReceived è necessario dichiarare membri

public String _id;
public String response_code;
public Result result;

Nella classe Risultato è necessario dichiarare membri

Map<String,Map<String,Map<String,Map<String,Object>>>> results=new HashMap<String,Map<String,Map<String,Map<String,Object>>>>();,
public String scan_id;
public String sha1;
public String resource;
public String response_code;
public String scan_date;
public String permalink;
public String verbose_msg;
public String total;
public String positives;
public String sha256;
public String md5;

E non dimenticare di usare @RestController sul tuo controller, analizzerai facilmente Json e otterrai tutti i valori richiesti.

 3
Author: Shubham kapoor, 2017-07-31 13:06:47

Sto chiamando il tuo modello principale come Scansione. È possibile creare un POJO (chiamiamolo Scanner) con gli attributi seguenti:
scannerName, rilevato, versione, risultato, aggiornamento;

Scanner.java

private String scannerName;
private String detected;
private String version;
private String result;
private String update;

Scansione.java

private String scan_id;
private List<Scanner> = new ArrayList<Scanner>();
private String sha1;
private String resource;
......
........

Quindi il tuo modello di scansione ora ha un elenco di scanner.

Usando morphia è qualcosa come:

@Embedded
private List<Scanner> scanner;

Se non si utilizza alcun wrapper attorno al driver java, provare

private List<BasicDBObject>
 1
Author: Probal, 2017-07-31 06:15:24