Como converter jsonString para JSONObject em Java

423

Eu tenho a variável String chamada jsonString:

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

Agora eu quero convertê-lo em objeto JSON. Pesquisei mais no Google, mas não obtive as respostas esperadas ...

Mr. Sajid Shaikh
fonte
1
Não é certo, porque eu queria criar objeto json a partir de json string, a resposta dada por dogbane mostrou o caminho certo para responder.
Sr. Sajid Shaikh
As duas respostas do Mappan e dogbane estão corretas, mas estão usando módulos diferentes. Você deve ter cuidado para importar o módulo correto para cada um, porque existem muitos módulos JSONObject.
Arashsoft
Eu tentei com a biblioteca GSON. Por favor, verifique este link .
Thirumalvalavan
Aqui está um pequeno vídeo que demonstra como criar um JSONObject em Java usando o org.json.
drorw

Respostas:

677

Usando a biblioteca org.json :

try {
     JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
     Log.d("Error", err.toString());
}
dogbane
fonte
7
Eu tentei com isso JSONObject js = new JSONObject (jsonstring); mas mostra erro. em jsonstring
Sr. Sajid Shaikh
29
ele recebeu um erro porque não está usando o org.json, está usando o google-gson, o que não funciona dessa maneira.
Gubatron
2
@Gubatron Obrigado cara, você está certo, acabei de baixá-lo e fazer o jar, agora está funcionando bem.
Sr. Sajid Shaikh
3
@ dogbane E se eu não souber a estrutura da string. Mais claramente, como posso converter um jsonString gerado dinamicamente em jsonObject?
Saumyaraj 20/03
70
Usando o google-gson, você pode fazer o seguinte:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy
163

Para quem ainda procura uma resposta:

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);
Mappan
fonte
23
E você pode mencionar qual pacote importar para o mesmo?
GonePhishing
10
Isso está funcionando para mim com:import org.json.simple.JSONObject
Mafro34
1
A versão 1.1.1 do json-simple parece ter algum problema. A descrição acima fornece "Exceção não tratada" para parser.parse(e quer tentar pegar ou jogar. Porém, quando você adiciona uma delas, Unhandled exception type ParseExceptionocorre um erro ou um erro NoClassDefFound para ParseException, org.json.simple.parsermesmo quando você possui json-simple nas depedências do Maven e é claramente visível na biblioteca do projeto.
21616 Juha Untinen
2
org.json é uma biblioteca de prova de conceito. é um dos piores em termos de desempenho e recursos. Deve-se examinar o conjunto de recursos e o desempenho de uma json lib antes de escolher. Veja este benchmark que fiz usando o JMH: github.com/fabienrenaud/java-json-benchmark Ele mostra claramente o jackson mais rapidamente do que qualquer outra coisa e 5 a 6 vezes mais rápido que o org.json.
precisa
5
Analisador JSONParser = new JSONParser (); parece privado
Ouissal
46

Você pode usar google-gson. Detalhes:

Exemplos de Objetos

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

(Serialização)

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

Observe que você não pode serializar objetos com referências circulares, pois isso resultará em recursão infinita.

(Desserialização)

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

Outro exemplo para o Gson:

O Gson é fácil de aprender e implementar, você precisa saber os dois métodos a seguir:

-> toJson () - converte objeto java para o formato JSON

-> fromJson () - converte JSON em objeto 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);
  }

}

Resultado

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

Recursos:

Página inicial do projeto Google Gson

Guia do usuário do Gson

Exemplo

kamaci
fonte
"Se você está pedindo para processar no lado do cliente, isso depende da sua linguagem de programação. Por exemplo, com Java, você pode usar o google-gson" Eu acho que você provavelmente quis dizer "servidor" em vez de "cliente" lá. E ele marcou sua pergunta como "Java".
TJ Crowder
+1. Eu usei o Gson em 4-5 projetos agora, em contextos bastante diferentes, no lado do servidor e do cliente (também no aplicativo Android), e isso nunca me falhou. Lib muito agradável e limpo.
31413 Jonik
Se você deseja usar o gson, mas não tem uma classe POJO predefinida (ou seja, você tem um json genérico sem uma estrutura definida), esta resposta pode ajudar - stackoverflow.com/questions/4110664/…
Leandro David
40

Existem vários serializadores e desserializadores Java JSON vinculados na página inicial do JSON .

Até o momento da redação deste artigo, existem 22:

... mas é claro que a lista pode mudar.

TJ Crowder
fonte
24

Solução Java 7

import javax.json.*;

...

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

;

RSG
fonte
5
Esta biblioteca tem o pior desempenho de todos eles. Veja esta referência que fiz com o JMH: github.com/fabienrenaud/java-json-benchmark
fabien
15

Para converter Stringpara JSONObjectvocê, basta passar a Stringinstância para o Construtor deJSONObject .

Por exemplo:

JSONObject jsonObj = new JSONObject("your string");
Charu
fonte
10

Eu gosto de usar o google-gson para isso, e é precisamente porque não preciso trabalhar diretamente com o JSONObject.

Nesse caso, eu teria uma classe que corresponderá às propriedades do seu objeto 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);
...

No entanto, acho que sua pergunta é mais como: Como finalizar com um objeto JSONObject real de uma String JSON.

Eu estava olhando para a API do google-json e não consegui encontrar nada tão direto quanto a API do org.json, que provavelmente é o que você deseja usar se precisar muito de usar um JSONObject de barebones.

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

Com org.json.JSONObject (outra API completamente diferente) Se você quiser fazer algo como ...

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

Eu acho que a beleza do google-gson é que você não precisa lidar com o JSONObject. Você apenas pega json, passa a classe para a desserialização e seus atributos de classe serão compatíveis com o JSON, mas, novamente, todo mundo tem seus próprios requisitos, talvez você não possa se dar ao luxo de ter aulas pré-mapeadas. o lado de desserialização porque as coisas podem ser muito dinâmicas no lado Gerando JSON. Nesse caso, basta usar o json.org.

Gubatron
fonte
8

você deve importar o org.json

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

Cadeia de caracteres para JSON usando Jacksoncomcom.fasterxml.jackson.databind :

Supondo que sua string json represente assim: 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();
Yugerten
fonte
3

Se você estiver usando http://json-lib.sourceforge.net (net.sf.json.JSONObject)

é bem fácil:

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

ou

JSONObject json = JSONSerializer.toJSON(myJsonString);

obtenha os valores com json.getString (param), json.getInt (param) e assim por diante.

Thero
fonte
JSONObject json = JSONSerializer.toJSON (myJsonString); irá produzir um erroe de incompatibilidade de tipo as outras obras um
Henrique C.
3

Converter uma string em json e a picada é como json. {"phonetype": "N95", "cat": "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);
Aravind Cheekkallur
fonte
O que é o JSONParser? É apenas parte do provedor de contatos?
IgorGanapolsky
1
@IgorGanapolsky JSONParser é uma opção incorporada fornecida por JSON simples. Para fazer isso, inclua json-simple-1.1.1.jar
Aravind Cheekkallur
3

Use JsonNode do mais rápidoxml para a análise genérica de Json. Cria internamente um Mapa de valor-chave para todas as entradas.

Exemplo:

private void test(@RequestBody JsonNode node)

string de entrada:

{"a":"b","c":"d"}
Vishnu
fonte
2

Não há necessidade de usar nenhuma biblioteca externa.

Em vez disso, você pode usar esta classe :) (lida com listas pares, listas aninhadas e 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;
    }
}

Para converter sua string JSON em hashmap, use este:

HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(
Natesh bhat
fonte
2

Codehaus Jackson - eu sou essa API incrível desde 2012 para meus serviços RESTful web e JUnit. Com a API deles, você pode:

(1) Converta String JSON em Java bean

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

(2) Converter string JSON em objeto 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) Converter Java bean em 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. API JsonNode - Como usar, navegar, analisar e avaliar valores de um objeto JsonNode

  3. Tutorial - Tutorial simples de como usar o Jackson para converter a string JSON em JsonNode

Panini Luncher
fonte
1

Observe que o GSON com a desserialização de uma interface resultará em exceção, como abaixo.

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

Enquanto desserializar; O GSON não sabe qual objeto deve ser intantado para essa interface.

Isso é resolvido de alguma forma aqui .

No entanto, o FlexJSON tem essa solução inerentemente. enquanto serializa o tempo, ele adiciona o nome da classe como parte do json, como abaixo.

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

Então, o JSON será um pouco pesado; mas você não precisa escrever, o InstanceCreatorque é necessário no GSON.

Kanagavelu Sugumar
fonte
1

Usando org.json

Se você tiver uma String contendo texto no formato JSON, poderá obter o JSON Object seguindo as etapas:

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

Agora, para acessar o tipo de telefone

Sysout.out.println(jsonObject.getString("phonetype"));
Azhar Zafar
fonte
0

Para definir json único objeto para listar ie

"locations":{

}

para dentro List<Location>

usar

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

jackson.mapper-asl-1.9.7.jar

user3012570
fonte
0

Convertendo String em Json Object usando 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;
}
Anzar Ansari
fonte
-1

Melhor Vá de maneira mais simples usando org.jsonlib. Basta fazer uma abordagem muito simples como abaixo:

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

Agora objé a sua JSONObjectforma convertida da sua respectiva String. Isso acontece se você tiver pares nome-valor.

Para uma sequência, você pode passar diretamente para o construtor de JSONObject. Se for válido json String, tudo bem, caso contrário, lançará uma exceção.

TheLittleNaruto
fonte
Literalmente, fazendo o que você escreveu: user.put("email", "[email protected]")desencadeia uma exceção não tratada.
Sebastialonso
1
@Sebastialonso Sim, você precisa capturar a exceção. Assim:try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
TheLittleNaruto
@vidya Não, não é. Considere compará-lo novamente.
TheLittleNaruto
@vidya Sure Dude
TheLittleNaruto