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


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

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

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


"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



15

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

Por exemplo:

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

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.


8

você deve importar o org.json

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

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

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.


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

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

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(

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


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.


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

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


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

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


Literalmente, fazendo o que você escreveu: user.put("email", "someemail@mail.com")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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.