Jak przekonwertować jsonString na JSONObject w Javie


423

Mam zmienną String o nazwie jsonString:

{"phonetype":"N95","cat":"WP"}

Teraz chcę przekonwertować go na obiekt JSON. Szukałem więcej w Google, ale nie otrzymałem żadnych oczekiwanych odpowiedzi ...


1
Nie ma racji, ponieważ chciałem stworzyć obiekt json z ciągu json, odpowiedź udzielona przez dogbane pokazała właściwą ścieżkę do odpowiedzi.
Pan Sajid Shaikh,

Obie odpowiedzi Mappana i dogbane są poprawne, ale używają różnych modułów. Należy zachować ostrożność, aby zaimportować poprawny moduł dla każdego z nich, ponieważ istnieje wiele modułów JSONObject.
Arashsoft,

Próbowałem z biblioteką GSON. Sprawdź ten link .
Thirumalvalavan

Odpowiedzi:


677

Korzystanie z biblioteki org.json :

try {
     JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
     Log.d("Error", err.toString());
}

7
Próbowałem z JSONObject js = new JSONObject (jsonstring); ale pokazuje błąd. na jsonstring
Mr. Sajid Shaikh

29
dostał błąd, ponieważ nie używa org.json, używa google-gson, co nie działa w ten sposób.
Gubatron,

2
@Gubatron Dzięki stary, masz rację właśnie pobrałem go i zrobiłem słoik, więc teraz działa dobrze.
Pan Sajid Shaikh

3
@dogbane Co jeśli nie znam struktury łańcucha. Mówiąc dokładniej, jak mogę przekonwertować wygenerowany dynamicznie jsonString na jsonObject?
Saumyaraj

70
Korzystając z google-gson, możesz to zrobić w następujący sposób:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy

163

Do każdego, kto wciąż szuka odpowiedzi:

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);

23
Czy możesz podać nazwę pakietu, który chcesz zaimportować?
odszedł phishing

10
import org.json.simple.JSONObject
Działa

1
Wersja 1.1.1 json-simple wydaje się mieć pewien problem. Powyższe daje „Nieobsługiwany wyjątek” parser.parse(i chce try-catch lub rzutów. Ale po dodaniu jednego z nich pojawia się Unhandled exception type ParseExceptionbłąd lub błąd NoClassDefFound dla ParseException, org.json.simple.parsernawet jeśli masz json-simple w zależnościach Mavena i jest wyraźnie widoczny w bibliotece projektu.
Juha Untinen,

2
org.json to biblioteka typu proof-of-concept. jest to jedna z najgorszych pod względem wydajności i funkcji. Przed wyborem należy sprawdzić zestaw funkcji i wydajność biblioteki json lib. Zobacz ten test porównawczy, który zrobiłem przy użyciu JMH: github.com/fabienrenaud/java-json-benchmark Wyraźnie pokazuje Jacksona szybciej niż cokolwiek innego i 5 do 6 razy szybciej niż org.json.
fabien

5
JSONParser parser = new JSONParser (); wydaje się być w deprecjacji
Ouissal,

46

Możesz użyć google-gson. Detale:

Przykłady obiektów

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}

(Serializacja)

BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj); 
==> json is {"value1":1,"value2":"abc"}

Pamiętaj, że nie można serializować obiektów z referencjami kołowymi, ponieważ spowoduje to nieskończoną rekurencję.

(Deserializacja)

BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);  
==> obj2 is just like obj

Kolejny przykład Gsona:

Gson jest łatwy do nauczenia i wdrożenia, musisz wiedzieć, że są dwie następujące metody:

-> toJson () - konwertuje obiekt Java do formatu JSON

-> fromJson () - konwertuje JSON na obiekt Java

import com.google.gson.Gson;

public class TestObjectToJson {
  private int data1 = 100;
  private String data2 = "hello";

  public static void main(String[] args) {
      TestObjectToJson obj = new TestObjectToJson();
      Gson gson = new Gson();

      //convert java object to JSON format
      String json = gson.toJson(obj);

      System.out.println(json);
  }

}

Wynik

{"data1":100,"data2":"hello"}

Zasoby:

Strona główna projektu Google Gson

Podręcznik użytkownika Gson

Przykład


„Jeśli poprosisz o przetwarzanie po stronie klienta, zależy to od twojego języka programowania. Na przykład w Javie możesz użyć google-gson”. Myślę, że prawdopodobnie miałeś na myśli raczej „serwer” niż „klient”. I otagował swoje pytanie „Java”.
TJ Crowder

+1. Używałem Gsona w 4-5 projektach teraz, w zupełnie innych kontekstach, po stronie serwera i klienta (także w aplikacji na Androida) i nigdy mnie to nie zawiodło. Bardzo ładne i czyste lib.
Jonik

Jeśli chcesz używać gson, ale nie masz wstępnie zdefiniowanej klasy POJO (tj. Masz ogólny Json bez wstępnie zdefiniowanej struktury), ta odpowiedź może pomóc - stackoverflow.com/questions/4110664/...
Leandro David



15

Aby przekonwertować Stringna JSONObjectCiebie, wystarczy przekazać Stringinstancję do Konstruktora JSONObject.

Na przykład:

JSONObject jsonObj = new JSONObject("your string");

10

Lubię do tego używać google-gson i to właśnie dlatego, że nie muszę bezpośrednio współpracować z JSONObject.

W takim przypadku miałbym klasę, która będzie odpowiadać właściwościom Twojego obiektu JSON

class Phone {
 public String phonetype;
 public String cat;
}


...
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
Gson gson = new Gson();
Phone fooFromJson = gson.fromJson(jsonString, Phone.class);
...

Myślę jednak, że twoje pytanie jest bardziej jak: Jak skończyć z rzeczywistym obiektem JSONObject z ciągu JSON.

Patrzyłem na interfejs google-json i nie mogłem znaleźć niczego tak prostego jak interfejs org.json, który prawdopodobnie jest tym, czego chcesz używać, jeśli bardzo potrzebujesz JSONObject.

http://www.json.org/javadoc/org/json/JSONObject.html

Z org.json.JSONObject (inny całkowicie inny API) Jeśli chcesz zrobić coś takiego jak ...

JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
System.out.println(jsonObject.getString("phonetype"));

Myślę, że piękno Google-gson polega na tym, że nie musisz zajmować się JSONObject. Po prostu łapiesz Jsona, przekazujesz klasę, do której chcesz dokonać deserializacji, a twoje atrybuty klasy zostaną dopasowane do JSON, ale z drugiej strony każdy ma swoje własne wymagania, być może nie możesz sobie pozwolić na luksus, na który mają wstępnie zmapowane klasy strona deserializująca, ponieważ po stronie generującej JSON może być zbyt dynamicznie. W takim przypadku wystarczy użyć json.org.


8

musisz zaimportować org.json

JSONObject jsonObj = null;
        try {
            jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
        } catch (JSONException e) {
            e.printStackTrace();
        }

8

Ciąg do JSON za Jacksonpomocą com.fasterxml.jackson.databind:

Zakładając, że twój ciąg json reprezentuje to: jsonString = {"phonetype": "N95", "cat": "WP"}

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * Simple code exmpl
 */
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonString);
String phoneType = node.get("phonetype").asText();
String cat = node.get("cat").asText();

3

Jeśli używasz http://json-lib.sourceforge.net (net.sf.json.JSONObject)

to jest dość łatwe:

String myJsonString;
JSONObject json = JSONObject.fromObject(myJsonString);

lub

JSONObject json = JSONSerializer.toJSON(myJsonString);

uzyskaj wartości następnie z json.getString (param), json.getInt (param) i tak dalej.


JSONObject json = JSONSerializer.toJSON (myJsonString); spowoduje powstanie błędu niedopasowania typu, z którego działa drugi
Henrique C.,

3

Aby przekonwertować ciąg na json, a żądło jest jak json. {„typ telefonu”: „N95”, „kot”: „WP”}

String Data=response.getEntity().getText().toString(); // reading the string value 
JSONObject json = (JSONObject) new JSONParser().parse(Data);
String x=(String) json.get("phonetype");
System.out.println("Check Data"+x);
String y=(String) json.get("cat");
System.out.println("Check Data"+y);

Co to jest JSONParser? Czy to tylko część dostawcy kontaktów?
IgorGanapolsky

1
@IgorGanapolsky JSONParser to opcja dostępna przez prosty JSON. Aby to zrobić, dołącz json-simple-1.1.1.jar
Aravind Cheekkallur

3

Użyj JsonNode z szybciejxml do ogólnego analizowania Json. Wewnętrznie tworzy mapę kluczowej wartości dla wszystkich danych wejściowych.

Przykład:

private void test(@RequestBody JsonNode node)

Ciąg wejściowy:

{"a":"b","c":"d"}

2

Nie trzeba używać żadnej zewnętrznej biblioteki.

Zamiast tego możesz użyć tej klasy :) (obsługuje nawet listy, listy zagnieżdżone i json)

public class Utility {

    public static Map<String, Object> jsonToMap(Object json) throws JSONException {

        if(json instanceof JSONObject)
            return _jsonToMap_((JSONObject)json) ;

        else if (json instanceof String)
        {
            JSONObject jsonObject = new JSONObject((String)json) ;
            return _jsonToMap_(jsonObject) ;
        }
        return null ;
    }


   private static Map<String, Object> _jsonToMap_(JSONObject json) throws JSONException {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != JSONObject.NULL) {
            retMap = toMap(json);
        }
        return retMap;
    }


    private static Map<String, Object> toMap(JSONObject object) throws JSONException {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keys();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            map.put(key, value);
        }
        return map;
    }


    public static List<Object> toList(JSONArray array) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.length(); i++) {
            Object value = array.get(i);
            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }
        return list;
    }
}

Aby przekonwertować ciąg JSON na skrót, użyj tego:

HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(

2

Codehaus Jackson - Jestem niesamowitym API od 2012 roku dla moich usług RESTful i testów JUnit. Dzięki ich interfejsowi API możesz:

(1) Konwertuj ciąg JSON na bean Java

public static String beanToJSONString(Object myJavaBean) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.writeValueAsString(myJavaBean);
}

(2) Konwertuj ciąg JSON na obiekt JSON (JsonNode)

public static JsonNode stringToJSONObject(String jsonString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readTree(jsonString);
}

//Example:
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";   
JsonNode jsonNode = stringToJSONObject(jsonString);
Assert.assertEquals("Phonetype value not legit!", "N95", jsonNode.get("phonetype").getTextValue());
Assert.assertEquals("Cat value is tragic!", "WP", jsonNode.get("cat").getTextValue());

(3) Konwertuj komponent bean Java na JSON String

    public static Object JSONStringToBean(Class myBeanClass, String JSONString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readValue(JSONString, beanClass);
}

REFS:

  1. Codehaus Jackson

  2. JsonNode API - jak używać, nawigować, analizować i oceniać wartości z obiektu JsonNode

  3. Tutorial - Prosty tutorial, jak używać Jacksona do konwersji ciągu JSON na JsonNode


1

UWAGA: GSON z deserializacją interfejsu spowoduje wyjątek taki jak poniżej.

"java.lang.RuntimeException: Unable to invoke no-args constructor for interface XXX. Register an InstanceCreator with Gson for this type may fix this problem."

Podczas deserializacji; GSON nie wie, który obiekt musi być intantowany dla tego interfejsu.

Jest to rozwiązane jakoś tutaj .

Jednak FlexJSON ma to rozwiązanie z natury. podczas szeregowania czasu dodaje nazwę klasy jako część json jak poniżej.

{
    "HTTPStatus": "OK",
    "class": "com.XXX.YYY.HTTPViewResponse",
    "code": null,
    "outputContext": {
        "class": "com.XXX.YYY.ZZZ.OutputSuccessContext",
        "eligible": true
    }
}

Tak więc JSON będzie trochę oblewał; ale nie potrzebujesz pisać, InstanceCreatorco jest wymagane w GSON.


1

Korzystanie z org.json

Jeśli masz ciąg znaków zawierający tekst w formacie JSON, możesz uzyskać obiekt JSON, wykonując następujące czynności:

String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
JSONObject jsonObj = null;
    try {
        jsonObj = new JSONObject(jsonString);
    } catch (JSONException e) {
        e.printStackTrace();
    }

Teraz, aby uzyskać dostęp do rodzaju telefonu

Sysout.out.println(jsonObject.getString("phonetype"));

0

Do ustawiania pojedynczego obiektu Json na listę tj

"locations":{

}

w List<Location>

posługiwać się

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

jackson.mapper-asl-1.9.7.jar


0

Konwertowanie ciągu znaków na obiekt Json za pomocą org.json.simple.JSONObject

private static JSONObject createJSONObject(String jsonString){
    JSONObject  jsonObject=new JSONObject();
    JSONParser jsonParser=new  JSONParser();
    if ((jsonString != null) && !(jsonString.isEmpty())) {
        try {
            jsonObject=(JSONObject) jsonParser.parse(jsonString);
        } catch (org.json.simple.parser.ParseException e) {
            e.printStackTrace();
        }
    }
    return jsonObject;
}

-1

Lepiej idź w prostszy sposób, używając org.jsonlib. Po prostu zastosuj bardzo proste podejście, jak poniżej:

JSONObject obj = new JSONObject();
obj.put("phonetype", "N95");
obj.put("cat", "WP");

Teraz objjest konwertowana JSONObjectforma odpowiedniego ciągu. Dzieje się tak w przypadku, gdy masz pary nazwa-wartość.

W przypadku ciągu możesz bezpośrednio przekazać konstruktor JSONObject. Jeśli to będzie poprawne json String, to dobrze, w przeciwnym razie spowoduje wyjątek.


Dosłownie robienie tego, co napisałeś: user.put("email", "someemail@mail.com")wyzwala nieobsługiwany wyjątek.
Sebastialonso,

1
@Sebastialonso Tak, musisz złapać wyjątek. Jak to:try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
TheLittleNaruto

@vidya Nie, to nie jest. Rozważ porównanie ponownie.
TheLittleNaruto,

@vidya Sure Dude
TheLittleNaruto
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.