【问题标题】:How to convert json objects with number as field key in Java?如何在Java中将带有数字作为字段键的json对象转换?
【发布时间】:2013-07-24 03:23:23
【问题描述】:

我正在使用的服务器返回一个 json 对象,其中包含一个对象列表,而不仅仅是一个。

{
"1":{"id":"1","value":"something"},
"2":{"id":"2","value":"some other thing"}
}

我想把这个json对象转换成对象数组。

我知道我可以使用 Gson,并创建一个这样的类:

public class Data {
    int id;
    String value;
}

然后使用

Data data = new Gson().fromJson(response, Data.class);

但它仅适用于 json 对象内的对象。 我不知道如何转换以数字为键的json对象。

或者我需要更改服务器以响应这样的事情?:

{["id":"1","value":"something"],["id":"2","value":"some other thing"]}

但我不想更改为服务器,因为我必须更改所有客户端代码。

【问题讨论】:

  • 那个 JSON 样本看起来像一个地图。那么如何将其转换为地图,然后从该地图中获取 values() 呢?它看起来并不完全正确,但我认为您的 Json 字符串不正确:)
  • 不是“对象列表”。它是一个包含其他对象的对象,这些对象碰巧使用数字作为字段名称 - 或者基本上是最基本的 Map<Integer, Data>

标签: java json gson


【解决方案1】:

你的 JSON 看起来很奇怪。如果无法更改,则必须将其反序列化为Map。示例源代码可能如下所示:

import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

public class GsonProgram {

    public static void main(String... args) throws Exception {
        Gson gson = new GsonBuilder().create();
        String json = "{\"1\":{\"id\":\"1\",\"value\":\"something\"},\"2\":{\"id\":\"2\",\"value\":\"some other thing\"}}";

        Type type = new TypeToken<HashMap<String, HashMap<String, String>>>() {}.getType();
        Map<String, Map<String, String>> map = gson.fromJson(json, type);
        for (Map<String, String> data : map.values()) {
            System.out.println(Data.fromMap(data));
        }
    }
}

class Data {

    private int id;
    private String value;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Data [id=" + id + ", value=" + value + "]";
    }

    public static Data fromMap(Map<String, String> properties) {
        Data data = new Data();
        data.setId(new Integer(properties.get("id")));
        data.setValue(properties.get("value"));

        return data;
    }
}

上面的程序打印:

Data [id=2, value=some other thing]
Data [id=1, value=something]

【讨论】:

  • 谢谢,但是我的 json 对象要复杂得多,需要构造一个相应的类。但是我发现了一种读取 json 对象的原始方法,它只获取我需要的字段。还是谢谢。
  • @SandeepanNath,我不明白你的问题。不接受的答案对您有用吗?你试过使用JsonParserJsonElement 类吗?
  • 我的意思是如何读取第一个值1 - { This one -> "1" :{"id":"1","value":"something"}, "2" : {"id":"2","value":"其他东西"} }
  • 在我的示例中,我使用MapMap&lt;String, Map&lt;String, String&gt;&gt; map = gson.fromJson(json, type);。您将在该地图的键集中找到1。类似map.keySet()
【解决方案2】:

因为这个json对象使用int作为字段键,所以在反序列化时不能指定字段键名。因此我需要先从集合中提取值集合:

JsonParser parser = new JsonParser();
JsonObject obj = parser.parse(json).getAsJsonObject();
Set<Entry<String,JsonElement>> set = obj.entrySet();

现在“set”包含一组 ,在我的例子中是 。

因为这里key没用,我只需要value集合,所以我迭代set提取value集合。

for (Entry<String,JsonElement> j : set) {
            JsonObject value = (JsonObject) j.getValue();
            System.out.println(value.get("id"));
            System.out.println(value.get("value"));
        }

如果你有更复杂的结构,比如嵌套的 json 对象,你可以有这样的东西:

for (Entry<String,JsonElement> j : locations) {
            JsonObject location = (JsonObject) j.getValue();
            JsonObject coordinate = (JsonObject) location.get("coordinates");
            JsonObject address = (JsonObject) location.get("address");
            System.out.println(location.get("location_id"));
            System.out.println(location.get("store_name"));
            System.out.println(coordinate.get("latitude"));
            System.out.println(coordinate.get("longitude"));
            System.out.println(address.get("street_number"));
            System.out.println(address.get("street_name"));
            System.out.println(address.get("suburb"));
        }

希望对你有帮助。

【讨论】:

  • JsonParser 类是什么/在哪里?
  • @PranoyC 它来自 Jackson Java 库
猜你喜欢
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2014-01-19
  • 2017-09-09
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多