我有String变量称为jsonString
:
{"phonetype":"N95","cat":"WP"}
现在,我想将其转换为JSON对象。我在Google上搜索了更多内容,但没有得到任何预期的答案...
我有String变量称为jsonString
:
{"phonetype":"N95","cat":"WP"}
现在,我想将其转换为JSON对象。我在Google上搜索了更多内容,但没有得到任何预期的答案...
Answers:
使用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();
对于仍在寻找答案的任何人:
JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);
import org.json.simple.JSONObject
parser.parse(
并希望尝试捕获或抛出。但是,当您添加其中之一时,即使您在Maven依赖项中具有json-simple并且在项目库中清晰可见,它也会Unhandled exception type ParseException
为ParseException 给出错误或NoClassDefFound错误org.json.simple.parser
。
您可以使用google-gson
。细节:
对象实例
class BagOfPrimitives {
private int value1 = 1;
private String value2 = "abc";
private transient int value3 = 3;
BagOfPrimitives() {
// no-args constructor
}
}
(序列化)
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);
==> json is {"value1":1,"value2":"abc"}
请注意,您无法使用循环引用序列化对象,因为这将导致无限递归。
(反序列化)
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
==> obj2 is just like obj
Gson的另一个示例:
Gson很容易学习和实现,您需要知道以下两种方法:
-> toJson()–将Java对象转换为JSON格式
-> fromJson()–将JSON转换为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);
}
}
输出量
{"data1":100,"data2":"hello"}
资源:
Java 7解决方案
import javax.json.*;
...
String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()
;
我喜欢为此使用google-gson,这恰恰是因为我不需要直接使用JSONObject。
在这种情况下,我将拥有一个与您的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);
...
但是,我认为您的问题更像是,如何从JSON字符串中获得实际的JSONObject对象。
我正在看google-json api,找不到像org.json的api一样直接的东西,如果您非常需要使用准系统JSONObject,那么这可能就是您想要使用的api。
http://www.json.org/javadoc/org/json/JSONObject.html
使用org.json.JSONObject(另一个完全不同的API)如果您想做类似的事情...
JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
System.out.println(jsonObject.getString("phonetype"));
我认为google-gson的优点在于您不需要处理JSONObject。您只需获取json,将要反序列化的类传递给您,并且您的类属性将与JSON匹配,但是同样,每个人都有自己的要求,也许您负担不起在其上预先映射类的负担反序列化方面,因为在JSON生成方面,事情可能太动态了。在这种情况下,只需使用json.org。
使用Jackson
with将字符串转换为JSONcom.fasterxml.jackson.databind
:
假设您的json-string表示为: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();
如果您使用的是http://json-lib.sourceforge.net (net.sf.json.JSONObject)
这很容易:
String myJsonString;
JSONObject json = JSONObject.fromObject(myJsonString);
要么
JSONObject json = JSONSerializer.toJSON(myJsonString);
然后使用json.getString(param),json.getInt(param)等获取值。
将字符串转换为json和字符串类似于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);
无需使用任何外部库。
您可以改用此类:)(甚至处理列表,嵌套列表和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;
}
}
要将您的JSON字符串转换为hashmap,请使用以下命令:
HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(
Codehaus Jackson-自2012年以来,我一直使用这个出色的API来进行RESTful网络服务和JUnit测试。借助他们的API,您可以:
(1)将JSON字符串转换为Java bean
public static String beanToJSONString(Object myJavaBean) throws Exception {
ObjectMapper jacksonObjMapper = new ObjectMapper();
return jacksonObjMapper.writeValueAsString(myJavaBean);
}
(2)将JSON字符串转换为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)将Java bean转换为JSON字符串
public static Object JSONStringToBean(Class myBeanClass, String JSONString) throws Exception {
ObjectMapper jacksonObjMapper = new ObjectMapper();
return jacksonObjMapper.readValue(JSONString, beanClass);
}
REFS:
JsonNode API-如何使用,浏览,解析和评估JsonNode对象中的值
教程 -简单的教程,如何使用Jackson将JSON字符串转换为JsonNode
注意,将接口反序列化的GSON将导致如下异常。
"java.lang.RuntimeException: Unable to invoke no-args constructor for interface XXX. Register an InstanceCreator with Gson for this type may fix this problem."
反序列化时;GSON不知道该接口必须实例化哪个对象。
这在某种程度上解决了这里。
但是,FlexJSON本质上具有此解决方案。在序列化时间时,它将类名称作为json的一部分添加,如下所示。
{
"HTTPStatus": "OK",
"class": "com.XXX.YYY.HTTPViewResponse",
"code": null,
"outputContext": {
"class": "com.XXX.YYY.ZZZ.OutputSuccessContext",
"eligible": true
}
}
因此,JSON将变得有些麻烦;但您不需要InstanceCreator
GSON中需要的写入。
使用org.json
如果您的字符串包含JSON格式的文本,则可以通过以下步骤获取JSON对象:
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
JSONObject jsonObj = null;
try {
jsonObj = new JSONObject(jsonString);
} catch (JSONException e) {
e.printStackTrace();
}
现在访问电话类型
Sysout.out.println(jsonObject.getString("phonetype"));
使用org.json.simple.JSONObject将String转换为Json Object
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;
}
通过使用org.json
lib,以更简单的方式更好地运行。只需执行一个非常简单的方法,如下所示:
JSONObject obj = new JSONObject();
obj.put("phonetype", "N95");
obj.put("cat", "WP");
现在obj
是您转换JSONObject
后的字符串形式。如果您有“名称/值”对,这是万一的。
对于字符串,您可以直接传递给的构造函数JSONObject
。如果它是有效的json String
,那么可以,否则它将引发异常。
user.put("email", "someemail@mail.com")
触发未处理的异常。
try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}