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