Java jsonString JSONObject dönüştürmek nasıl


423

Dize değişkeni adlı jsonString:

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

Şimdi bunu JSON Object'e dönüştürmek istiyorum. Google'da daha fazla arama yaptım ancak beklenen cevapları alamadım ...


1
Hayır doğru, çünkü json dizesinden json nesnesi oluşturmak istedim, dogbane tarafından verilen cevap cevaplamak için doğru yolu gösterdi.
Bay Sajid Shaikh

Mappan ve dogbane'in cevapları doğru ama farklı modüller kullanıyorlar. Birçok JSONObject modülü olduğu için her biri için doğru modülü içe aktarmaya dikkat etmelisiniz.
Arashsoft

GSON kütüphanesi ile denedim. Lütfen bu bağlantıyı kontrol edin .
Thirumalvalavan

Yanıtlar:


677

Org.json kütüphanesini kullanma :

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

7
JSONObject js = yeni JSONObject (jsonstring) gibi denedim; ancak hata gösterir. jsonstring
Bay Sajid Shaikh

29
bir hata aldı çünkü org.json kullanmıyor, bu şekilde çalışmayan google-gson kullanıyor.
Gubatron

2
@Gubatron Teşekkürler ahbap haklısın, sadece indirdim ve kavanoz yapıyorum, şimdi iyi çalışıyor.
Bay Sajid Shaikh

3
@dogbane Ya ipin yapısını bilmiyorsam. Daha açık bir şekilde, Dinamik olarak oluşturulan bir jsonString'i jsonObject'e nasıl dönüştürebilirim?
Saumyaraj

70
Google-gson kullanarak bunu şöyle yapabilirsiniz:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy

163

Hala bir cevap arayan herkese:

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

23
Ve aynı paket için hangi paketi ithal edeceğinizi söyleyebilir misiniz?
2015'te

10
Bu benim için çalışıyor:import org.json.simple.JSONObject
Mafro34

1
Json-simple 1.1.1 sürümünde bazı sorunlar var gibi görünüyor. Yukarıda "İşlenmemiş İstisna" verilir parser.parse(ve try-catch veya atar ister. Ancak bunlardan birini eklediğinizde , Maven bağımlılıklarında json-basit ve projenin kütüphanesinde açıkça görülebiliyor olsa bile Unhandled exception type ParseExceptionParseException için bir hata veya NoClassDefFound hatası verir org.json.simple.parser.
Juha Untinen

2
org.json, kavram kanıtıdır. performans ve özellikler açısından en kötülerinden biridir. Seçmeden önce bir json lib'in özellik setine ve performansına bakılmalıdır. JMH kullanarak yaptığım bu kıstasa bakın: github.com/fabienrenaud/java-json-benchmark Jackson'u org.json'dan daha hızlı ve 5 ila 6 kat daha hızlı gösterir.
fabien

5
JSONParser ayrıştırıcı = yeni JSONParser (); depricated görünüyor
Ouissal

46

Kullanabilirsiniz google-gson. Detaylar:

Nesne Örnekleri

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

(Seri)

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

Sonsuz özyinelemeye neden olacağından, dairesel referanslarla nesneleri serileştiremeyeceğinizi unutmayın.

(Seri kaldırma)

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

Gson için başka bir örnek:

Gson'un öğrenmesi ve uygulanması kolaydır, bilmeniz gereken aşağıdaki iki yöntemdir:

-> toJson () - java nesnesini JSON formatına dönüştürür

-> fromJson () - JSON'u java nesnesine dönüştür

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);
  }

}

Çıktı

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

Kaynaklar:

Google Gson Projesi Ana Sayfası

Gson Kullanım Kılavuzu

Misal


"İstemci tarafında işlem yapmak istiyorsanız, programlama dilinize bağlıdır. Örneğin Java ile google-gson kullanabilirsiniz" Bence orada "istemci" yerine "sunucu" demek istediniz . Ve sorusunu "Java" olarak etiketledi.
TJ Crowder

+1. Gson'u şimdi 4-5 projede, oldukça farklı bağlamlarda, sunucu ve istemci tarafında (Android uygulamasında da) kullandım ve asla başarısız olmadı. Çok güzel ve temiz lib.
Jonik

Gson kullanmak istiyorsanız, ancak önceden tanımlanmış bir POJO sınıfınız yoksa (yani, önceden tanımlanmış bir yapısı olmayan genel bir jsonunuz varsa), bu yanıt yardımcı olabilir - stackoverflow.com/questions/4110664/…
Leandro David


24

Java 7 çözümü

import javax.json.*;

...

String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()

;


5
Bu kütüphane en kötü performansa sahiptir. JMH
fabien

15

Eğer dönüştürmek Stringiçin JSONObjectsadece StringÖrnek yapıcı geçmek gerekir JSONObject.

Örneğin:

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

10

Bunun için google-gson kullanmayı seviyorum ve bunun nedeni doğrudan JSONObject ile çalışmam gerekmiyor.

Bu durumda JSON Nesnenizin özelliklerine karşılık gelen bir sınıfım olurdu

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);
...

Ancak, sorunuzun daha çok olduğunu düşünüyorum, nasıl JSON String gerçek bir JSONObject nesnesi ile bitirmek.

Ben google-json api bakıyordum ve bir barebones JSONObject kullanmaya ihtiyacınız varsa, muhtemelen kullanmak istediğiniz şey olan org.json api gibi düz bir şey bulamadım.

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

Org.json.JSONObject (başka bir tamamen farklı API ile) gibi bir şey yapmak istiyorsanız ...

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

Ben google-gson güzelliği JSONObject ile uğraşmak gerekmez olduğunu düşünüyorum. Sadece json kaparsınız, serisini kaldırmak istediğiniz sınıfı geçirirsiniz ve sınıf özellikleriniz JSON ile eşleştirilir, ancak daha sonra herkesin kendi gereksinimleri vardır, belki de önceden eşleştirilmiş sınıflara sahip olmak için lüksü göze alamazsınız serileştirme tarafı çünkü işler JSON Üreten tarafında çok dinamik olabilir. Bu durumda sadece json.org'u kullanın.


8

org.json dosyasını içe aktarmalısınız

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

8

JSON dize kullanarak Jacksonile com.fasterxml.jackson.databind:

Json-string'inizin şu şekilde olduğunu varsayarsak: 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

Eğer kullanıyorsanız http://json-lib.sourceforge.net (net.sf.json.JSONObject)

oldukça kolay:

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

veya

JSONObject json = JSONSerializer.toJSON(myJsonString);

değerleri json.getString (param), json.getInt (param) vb. ile alın.


JSONObject json = JSONSerializer.toJSON (myJsonString); diğeri işe yarayan bir tür uyumsuzluk üretecek
Henrique C.

3

Bir dizeyi json'a dönüştürmek ve sokmak json gibidir. { "PHONETYPE": "N95", "kedi": "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);

JSONParser nedir? Yalnızca Kişi Sağlayıcının bir parçası mı?
IgorGanapolsky

1
@IgorGanapolsky JSONParser, basit JSON tarafından sağlanan bir seçenektir. Bunu yapmak için, json-simple-1.1.1.jar
Aravind Cheekkallur

3

Generic Json Ayrıştırma işlemi için JxNode fastxxml kullanın. Dahili olarak tüm girişler için bir anahtar değere sahip Harita oluşturur.

Misal:

private void test(@RequestBody JsonNode node)

giriş Dizesi:

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

2

Herhangi bir harici kütüphane kullanmaya gerek yoktur.

Bunun yerine bu sınıfı kullanabilirsiniz :) (hatta listeleri, iç içe listeleri ve json'u işler)

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;
    }
}

JSON dizenizi hashmap biçimine dönüştürmek için şunu kullanın:

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

2

Codehaus Jackson - 2012'den beri RESTful webservice ve JUnit testlerim için bu harika API'yim . API'leriyle şunları yapabilirsiniz:

(1) JSON Dizesini Java fasulyesine dönüştürün

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

(2) JSON Dizesini JSON nesnesine dönüştürme (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) Java fasulyesini JSON String'e dönüştürün

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

ref:

  1. Codehaus Jackson

  2. JsonNode API - JsonNode nesnesinden değerleri kullanma, gezinme, ayrıştırma ve değerlendirme

  3. Eğitim - Basit öğretici nasıl JSON dizesini JsonNode dönüştürmek için Jackson kullanmak


1

Bir arayüzün serileştirmesi ile GSON'un aşağıdaki gibi istisnalara neden olacağını unutmayın.

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

Serileştirmeyi kaldırırken; GSON bu arayüz için hangi nesnenin başlatılması gerektiğini bilmiyor.

Bu bir şekilde burada çözüldü .

Ancak FlexJSON bu çözümü doğasında var. serileştirme zamanı aşağıdaki gibi json parçası olarak sınıf adı ekliyor.

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

Yani JSON kimi olacak; ancak InstanceCreatorGSON'da gerekli olan yazmaya ihtiyacınız yoktur.


1

Org.json kullanma

JSON biçiminde metin içeren bir Dizeniz varsa, aşağıdaki adımları izleyerek JSON Nesnesi'ni alabilirsiniz:

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

Şimdi telefon tipine erişmek için

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

0

Json tek nesnesini listeleyecek şekilde ayarlamak için

"locations":{

}

için List<Location>

kullanım

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

jackson.mapper-asl-1.9.7.jar


0

Dizeyi org.json.simple.JSONObject kullanarak Json Nesnesine Dönüştürme

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

Daha iyi git org.jsonlib kullanarak daha basit bir yol . Sadece aşağıdaki gibi çok basit bir yaklaşım yapın:

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

Şimdi objsenin dönüşümünJSONObject ilgili Dizenizin biçiminiz. Ad-değer çiftleriniz varsa bu durum söz konusudur.

Bir dize için doğrudan yapıcısına geçebilirsiniz JSONObject. Geçerli olacaksa json String, tamam yoksa bir istisna atar.


Kelimenin tam anlamıyla yazdıklarınızı yapmak: user.put("email", "someemail@mail.com")işlenmemiş bir istisnayı tetikler.
Sebastialonso

1
@Sebastialonso Evet, istisnayı yakalamanız gerekiyor. try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
Şunun

@vidya Hayır, değil. Tekrar karşılaştırmayı düşünün.
TheLittleNaruto

@vidya Sure Dude
TheLittleNaruto
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.