当前位置: 首页 > 面试题库 >

使用GSON处理随机生成且不一致的JSON字段/密钥名称

颛孙正谊
2023-03-14
问题内容

我有以下JSON代码段:

{ "randomlygeneratedKeyname0" : "some-value",
  "randomlygeneratedKeyname1": {
       "randomlygeneratedKeyname2" : {
           "randomlygeneratedKeyname3": "some-value",
           "randomlygeneratedKeyname4": "some-value"
       },
       "randomlygeneratedKeyname5": {
           "randomlygeneratedKeyname6": "some-value",
           "randomlygeneratedKeyname7": "some-value"
       }
   }
}

请注意,我不知道其名称,randomlygeneratedKeyname并且它们的命名约定 不一致, 因此无法创建相应的Java字段/变量名称。

如何在GSON中反序列化它?

在此先感谢您的帮助。


问题答案:

代码转储解决方案:

import java.io.FileReader;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.reflect.TypeToken;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    Type mapStringObjectType = new TypeToken<Map<String, Object>>() {}.getType();

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(mapStringObjectType, new RandomMapKeysAdapter());
    Gson gson = gsonBuilder.create();

    Map<String, Object> map = gson.fromJson(new FileReader("input.json"), mapStringObjectType);
    System.out.println(map);
  }
}

class RandomMapKeysAdapter implements JsonDeserializer<Map<String, Object>>
{
  @Override
  public Map<String, Object> deserialize(JsonElement json, Type unused, JsonDeserializationContext context)
      throws JsonParseException
  {
    // if not handling primitives, nulls and arrays, then just 
    if (!json.isJsonObject()) throw new JsonParseException("some meaningful message");

    Map<String, Object> result = new HashMap<String, Object> ();
    JsonObject jsonObject = json.getAsJsonObject();
    for (Entry<String, JsonElement> entry : jsonObject.entrySet())
    {
      String key = entry.getKey();
      JsonElement element = entry.getValue();
      if (element.isJsonPrimitive())
      {
        result.put(key, element.getAsString());
      }
      else if (element.isJsonObject())
      {
        result.put(key, context.deserialize(element, unused));
      }
      // if not handling nulls and arrays
      else
      {
        throw new JsonParseException("some meaningful message");
      }
    }
    return result;
  }
}


 类似资料:
  • 问题内容: 我正在开发一款涉及车辆的游戏。我有一个名为“车辆”的MySQL表,其中包含有关车辆的数据,包括存储车辆牌照的“牌照”列。 现在是我遇到问题的部分。在创建新车辆之前,我需要找到一个未使用的车牌- 它应该是8个字母数字的随机字符串。我是如何实现的,是在我正在使用的语言Lua中使用while循环生成字符串并查询数据库以查看是否使用了它。但是,随着车辆数量的增加,我希望这将变得目前效率更低。因

  • 我试图使用GSON将一些Json反序列化为一个漂亮整洁的对象。现在,我已经设法让Json正确地映射到一些更明显的变量。然而,在尝试映射一些Json时,我发现: 在我来到之前,它一直映射得很好。我一辈子都想不出如何实现它。我认为主要的问题是它们不再是静态的类名,而是随机化的。因此,写这样的东西是完全不切实际的(也是不可能的): 我环顾了一下Stackoverflow,但答案似乎很复杂,很多答案都不太

  • 我正在尝试使用C#中的以下算法对XML文档进行签名: http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 当我尝试用随机的RSA密钥签名时,它工作得很好。 谢谢你! 托马斯

  • 我正在尝试研究如何将6个随机生成的数字添加到HashSet中。我得到了结果,但结果不一致。有时它会将6个数字打印到控制台,有时它会打印5个数字到控制台。 我是今天早上才开始接触这种东西的,所以如果很明显,我道歉,并感谢你的帮助。

  • 本文向大家介绍Python生成随机密码,包括了Python生成随机密码的使用技巧和注意事项,需要的朋友参考一下 本人  python新手,使用的环境是python2.7,勿喷 以上就是本文的全部内容了,希望对大家学习python能够有所帮助。

  • 安装程序 我在java和DynamoDB(DynamoDB Mapper)注释中有下表: 保存时会随机生成id,多个实体可能会出现相同的用户id。 通过Web GUI定义的表如下:主分区键:id(String)主排序键:userId(String) 问题 我想用一个查询而不是扫描获得一个用户ID的所有实体。 查询-不是这样工作的: 我当然得到: 因为我想读取数据时不知道生成的id。 工作区 相反,