我有字符串变量jsonString:
jsonString
{"phonetype":"N95","cat":"WP"}
现在我想把它转换成 JSON 对象。我在谷歌上搜索了更多,但没有得到任何预期的答案!
有各种Java JSON序列化器和反序列化器链接从JSON主页。
在撰写本文时,有22种:
JSON-java。 JSONUtil。 jsonp。 Json-lib。 Stringtree。 SOJO。 json-taglib。 Flexjson。 阿尔戈。 jsonij。 fastjson。 mjson。 jjson。 json-simple。 json-io。 google-gson。 FOSS Nova JSON。 玉米转换器。 Apache johnzon。 Genson的律师。 cookjson。 progbase。
...当然,这个名单是可以改变的。
使用org.json库:
try { JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}"); }catch (JSONException err){ Log.d("Error", err.toString()); }
你可以使用google-gson。细节:
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"}
资源:
谷歌Gson项目首页
Gson用户指南 .
< a href = " http://www.mkyong.com/java/how-do-convert-java-object-to-from-json-format-gson-api/ " > < / >示例
我喜欢为此使用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对象。
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。
如果你正在使用http://json-lib.sourceforge.net (net.sf.json.JSONObject) < / p >
这很简单:
String myJsonString; JSONObject json = JSONObject.fromObject(myJsonString);
或
JSONObject json = JSONSerializer.toJSON(myJsonString);
获取值然后用
将字符串转换为json, sting就像json一样。{“phonetype”:“N95”,“猫”:“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单个对象设置为列表 即< / p >
"locations":{ }
in到List<Location>
List<Location>
使用
ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
jackson.mapper-asl-1.9.7.jar
必须导入org.json
JSONObject jsonObj = null; try { jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}"); } catch (JSONException e) { e.printStackTrace(); }
对于仍在寻找答案的人:
JSONParser parser = new JSONParser(); JSONObject json = (JSONObject) parser.parse(stringToParse);
最好使用更简单的方法,使用org.json lib。只需要做一个非常简单的方法:
org.json
JSONObject obj = new JSONObject(); obj.put("phonetype", "N95"); obj.put("cat", "WP");
现在obj是你各自String的转换后的JSONObject形式。这是在有名称-值对的情况下。
obj
JSONObject
对于字符串,可以直接传递给JSONObject的构造函数。如果它是一个有效的json String,那么ok,否则它会抛出异常。
json String
java7解决方案
import javax.json.*; ... String TEXT; JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()
;
要将String转换为JSONObject,只需要将String实例传递给JSONObject的构造函数。
String
例如:
JSONObject jsonObj = new JSONObject("your string");
使用fastxmljsonnode进行通用Json解析。它在内部为所有输入创建键值的Map。
例子:
private void test(@RequestBody JsonNode node)
输入字符串:
{"a":"b","c":"d"}
注意,反序列化接口的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会有些麻烦;但是你不需要写GSON中要求的InstanceCreator。
InstanceCreator
不需要使用任何外部库。
你可以使用这个类代替:)(处理偶数列表,嵌套列表和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(
字符串转换成JSON使用Jackson和com.fasterxml.jackson.databind:
Jackson
com.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();
使用org.json
如果你有一个包含JSON格式文本的字符串,那么你可以通过以下步骤获取JSON对象:
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}"; JSONObject jsonObj = null; try { jsonObj = new JSONObject(jsonString); } catch (JSONException e) { e.printStackTrace(); }
现在访问phonetype
Sysout.out.println(jsonObject.getString("phonetype"));
Codehaus杰克逊 -自2012年以来,我一直是这个很棒的API,用于我的RESTful webservice和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); }
参考文献:
Codehaus Jackson
JsonNode API -如何使用,导航,解析和评估来自JsonNode对象的值
教程 -简单教程如何使用Jackson将JSON字符串转换为JsonNode
使用org.json.simple.JSONObject将String转换为Json对象
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; }
那些因为弃用问题而没有从发布的答案中找到解决方案的人,可以使用com.google.gson中的JsonParser。
JsonParser
JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject(); System.out.println(jsonObject.get("phonetype")); System.out.println(jsonObject.get("cat"));