我有一个JsonObject,例如
JsonObject jsonObject = {"keyInt":2,"keyString":"val1","id":"0123456"}
每个JSONObject都包含一个" id"条目,但没有确定其他键/值对的数量,所以我想创建一个具有2个属性的对象:
class myGenericObject {
Map<String, Object> attributes;
String id;
}
所以我希望我的属性映射看起来像这样:
"keyInt" -> 4711
"keyStr" -> "val1"
我找到了这个解决方案
Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
attributes.put(entry.getKey(), jsonObject.get(entry.getKey()));
}
但值包含在&#34;&#34;
中"keyInt" -> "4711"
"keyStr" -> ""val1""
如何获得普通值(4711和&#34; val1&#34;)?
输入数据:
{
"id": 0815,
"a": "a string",
"b": 123.4,
"c": {
"a": 1,
"b": true,
"c": ["a", "b", "c"]
}
}
或
{
"id": 4711,
"x": false,
"y": "y?",
}
答案 0 :(得分:8)
替换&#34;&#34;空白。
Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
if (! nonProperties.contains(entry.getKey())) {
properties.put(entry.getKey(), jsonObject.get(entry.getKey()).replace("\"",""));
}
}
答案 1 :(得分:3)
只需进行以下更改......
Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
attributes.put(entry.getKey(), jsonObject.get(entry.getKey()).getAsString());
}
&#34;符getAsString&#34;会为你做神奇的
答案 2 :(得分:2)
你是如何创建JsonObject的?你的代码适合我。考虑一下这个
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
...
...
...
try{
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("keyInt", 2);
jsonObject.addProperty("keyString", "val1");
jsonObject.addProperty("id", "0123456");
System.out.println("json >>> "+jsonObject);
Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
attributes.put(entry.getKey(), jsonObject.get(entry.getKey()));
}
for(Map.Entry<String,Object> att : attributes.entrySet()){
System.out.println("key >>> "+att.getKey());
System.out.println("val >>> "+att.getValue());
}
}
catch (Exception ex){
System.out.println(ex);
}
它工作正常。现在我有兴趣知道你是如何创建你的JSON的?
你也可以尝试这个(JSONObject)
import org.json.JSONObject;
...
...
...
try{
JSONObject jsonObject = new JSONObject("{\"keyInt\":2,\"keyString\":\"val1\",\"id\":\"0123456\"}");
System.out.println("JSON :: "+jsonObject.toString());
Iterator<String> it = jsonObject.keys();
while( it.hasNext() ){
String key = it.next();
System.out.println("Key:: !!! >>> "+key);
Object value = jsonObject.get(key);
System.out.println("Value Type "+value.getClass().getName());
}
}
catch (Exception ex){
System.out.println(ex);
}
答案 3 :(得分:1)
您的地图值为JsonElement
秒。每当您打印JsonElement
(例如使用调试器)时,将调用其toString()
方法 - 并且由于JsonElement
具有许多实现类,因此默认toString
实现将值包含在引号以确保正确的JSON。要将价值作为正常的,未展开的String
获取,只需致电getAsString()
:
JsonElement elem;
// ...
String value = elem.getAsString();
用你的例子:
Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
attributes.put(entry.getKey(), jsonObject.get(entry.getKey()).getAsString());
}
请注意,您可以在JsonElement
上调用许多其他方法来生成其他类型。
答案 4 :(得分:0)
我不太清楚你为什么要首先进行手动操作。 GSON解码将简单地将那些缺席的键/值对保留为默认值(零,空)。然后你可以按照自己的意愿进行处理。