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 ...
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 ...
Respostas:
Usando a biblioteca org.json :
try {
JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
Log.d("Error", err.toString());
}
JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
Para quem ainda procura uma resposta:
JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);
import org.json.simple.JSONObject
parser.parse(
e quer tentar pegar ou jogar. Porém, quando você adiciona uma delas, Unhandled exception type ParseException
ocorre um erro ou um erro NoClassDefFound para ParseException, org.json.simple.parser
mesmo quando você possui json-simple nas depedências do Maven e é claramente visível na biblioteca do projeto.
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:
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:
- JSON-java .
- JSONUtil .
- jsonp .
- Json-lib .
- Stringtree .
- SOJO .
- json-taglib .
- Flexjson .
- Argo .
- jsonij .
- fastjson .
- mjson .
- jjson .
- json-simples .
- json-io .
- google-gson .
- FOSS Nova JSON .
- CONVERSOR DE MILHO .
- Apache johnzon .
- Genson .
- cookjson .
- progbase .
... mas é claro que a lista pode mudar.
Solução Java 7
import javax.json.*;
...
String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()
;
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.
Cadeia de caracteres para JSON usando Jackson
comcom.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();
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.
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);
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(
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:
API JsonNode - Como usar, navegar, analisar e avaliar valores de um objeto JsonNode
Tutorial - Tutorial simples de como usar o Jackson para converter a string JSON em JsonNode
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 InstanceCreator
que é necessário no GSON.
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"));
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
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;
}
Melhor Vá de maneira mais simples usando org.json
lib. Basta fazer uma abordagem muito simples como abaixo:
JSONObject obj = new JSONObject();
obj.put("phonetype", "N95");
obj.put("cat", "WP");
Agora obj
é a sua JSONObject
forma 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.
user.put("email", "someemail@mail.com")
desencadeia uma exceção não tratada.
try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}