2014-09-29 10 views
8

Potrzebuję móc odczytać ciąg JSON z pliku i przeanalizować go.Standardowy analizator składni JSON dostarczany w pakiecie z językiem Java

Chcę wiedzieć, czy ciąg jest "dobrze sformułowany" JSON. Jeśli tak, potrzebuję móc odczytać wszystkie pary wartości nazw.

Czy istnieje biblioteka JSON dostarczana w pakiecie z samą Javą?

Wolałbym coś, co pochodzi ze standardową dystrybucją Java zamiast pobierania innej biblioteki zewnętrznej.

Używam JDK 1.6.

+0

Nie według mojej wiedzy. Większość analizatorów JSON dla Javy znajduje się na stronie json.org, na dole strony. –

+0

Niektórzy ludzie wydają się używać rhino http://stackoverflow.com/questions/10288669/access-rhinos-native-json-stringify-from-java/10837358 –

+0

ktoś użył json-simple, jego zestaw narzędzi json z google https : //code.google.com/p/json-simple/ – davison

Odpowiedz

4

Wypróbuj zbliżyć bez użycia zewnętrznej biblioteki

http://blog.julienviet.com/2011/12/26/json-to-java-with-jdk6/

ZREDAGOWANE

GitHub jest bardziej wiarygodne źródło kodu z określonego łącza. https://gist.github.com/vietj/1521692

Kluczem jest wykorzystanie JavaScript do analizowania, może być wywołany z:

public class JSON2Java { 

    private static final ScriptEngine jsonParser; 

    static 
    { 
     try 
     { 
     String init = read(Tools.class.getResource("json2java.js")); 
     ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); 
     engine.eval(init); 
     jsonParser = engine; 
     } 
     catch (Exception e) 
     { 
     // Unexpected 
     throw new AssertionError(e); 
     } 
    } 

    public static Object parseJSON(String json) 
    { 
     try 
     { 
     String eval = "new java.util.concurrent.atomic.AtomicReference(toJava((" + json + ")))"; 
     AtomicReference ret = (AtomicReference)jsonParser.eval(eval); 
     return ret.get(); 
     } 
     catch (ScriptException e) 
     { 
     throw new RuntimeException("Invalid json", e); 
     } 
    } 
} 

Javascript strony, json2java.js:

toJava = function(o) { 
    return o == null ? null : o.toJava(); 
}; 
Object.prototype.toJava = function() { 
    var m = new java.util.HashMap(); 
    for (var key in this) 
    if (this.hasOwnProperty(key)) 
     m.put(key, toJava(this[key])); 
    return m; 
}; 
Array.prototype.toJava = function() { 
    var l = this.length; 
    var a = new java.lang.reflect.Array.newInstance(java.lang.Object, l); 
    for (var i = 0;i < l;i++) 
    a[i] = toJava(this[i]); 
    return a; 
}; 
String.prototype.toJava = function() { 
    return new java.lang.String(this); 
}; 
Boolean.prototype.toJava = function() { 
    return java.lang.Boolean.valueOf(this); 
}; 
Number.prototype.toJava = function() { 
    return java.lang.Integer(this); 
}; 
+0

Chciałbym móc to zrobić !! Dzięki!! – davison

+1

Ta [odpowiedź wydaje się być w innym zamku] (http://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when-is-an-answer-not-an- odpowiedź). Zamiast linku do zewnętrznego źródła, należy opublikować odpowiedni materiał, nadając mu odpowiednią nazwę. Dzięki temu odpowiedź pozostanie istotna nawet wtedy, gdy link umrze w przyszłości. –

+0

@davison Następnie możesz zaakceptować moją prośbę. :) – kemenov

Powiązane problemy