【问题标题】:Parse json with variable key使用可变键解析 json
【发布时间】:2013-05-29 06:42:27
【问题描述】:

我刚想出了一个具有挑战性的问题。

以下是 json 响应,其中键是可变的(GUID)

我该如何解析它?我试过 Google Gson,但没有用。

{
  "87329751-7493-7329-uh83-739823748596": {
    "type": "work",
    "status": "online",
    "icon": "landline",
    "number": 102,
    "display_number": "+999999999"
  }
}

【问题讨论】:

  • 不确定我是否完全理解这个问题。根据 JSONLint,该 JSON 是有效的,因此您应该能够将其解析为 JSON。
  • 同意。但问题是随机生成的 GUID。
  • 我已经针对它创建了 pojo,但它不起作用,因为每次在服务器端生成的 GUID 都是不同且唯一的。:)
  • 你试过了吗:Object.keys(obj)
  • 只需将 JSON 解析为映射和数组,然后以老式方式访问这些内容。您没有必须为所有内容创建自定义类——大多数其他语言不这样做,而且在许多情况下,对于简单的 JSON 结构来说,这是毫无意义的额外工作。

标签: java json parsing gson


【解决方案1】:

如果您使用 Gson,为了解析您的响应,您可以创建一个自定义类来表示您的 JSON 数据,然后您可以使用 Map

请注意,Map<String, SomeObject> 正是您的 JSON 所代表的,因为您有一个 object,其中包含一对 string 和一些 object

{ "someString": {...} }

所以,首先你的类包含 JSON 数据(在伪代码中):

class YourClass
  String type
  String status
  String icon
  int number
  String display_number

然后使用 Map 解析您的 JSON 响应,如下所示:

Gson gson = new Gson();
Type type = new TypeToken<Map<String, YourClass>>() {}.getType();
Map<String, YourClass> map = gson.fromJson(jsonString, type);

现在您可以使用 Map 访问所有值,例如:

String GUID = map.keySet().get(0);
String type = map.get(GUID).getType();

注意:如果只想获取GUID值,则不需要创建类YourClass,也可以使用相同的解析代码,但在Map中使用通用的Object,即Map&lt;String, Object&gt;

【讨论】:

    【解决方案2】:

    我的猜测是您正在寻找一种获取 GUID 的方法。你可以试试Object.keys函数。

    json_string = '{"87329751-7493-7329-uh83-739823748596":{"type":"work","status":"online","icon":"landline","number":102,"display_number":"+999999999"}}';
    object = JSON.parse(js);
    key = Object.keys(object)[0];
    alert(key);
    

    它适用于 firefox 21.0,但我不能保证它适用于所有浏览器。

    【讨论】:

    • 亲爱的,我正在用 java 做。
    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多