本文介绍了使用GSON处理随机生成的和不一致的JSON字段/键名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下JSON片段:

  {randomlygeneratedKeyname0:some-value,
randomgeneratedKeyname1:{
randomlygeneratedKeyname2:{
randomlygeneratedKeyname3:some-value,
randomlygeneratedKeyname4:some-value
},
randomgeneratedKeyname5:{
randomlygeneratedKeyname6:some-value,
randomlygeneratedKeyname7:some-value
}
}
}

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



我如何(序列化) GSON?



在此先感谢您的帮助。

dump解决方案:

  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();

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

类RandomMapKeysAdapter实现了JsonDeserializer< Map< String,Object>>
{
@Override
public Map< String,Object>反序列化(JsonElement json,未使用类型,JsonDeserializationContext上下文)
抛出JsonParseException
{
//如果不处理primitives,nulls和数组,则只需
if(!json.isJsonObject ))抛出新的JsonParseException(一些有意义的消息);

地图< 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));
}
//如果不处理空值和数组
else
{
throw new JsonParseException(some useful message);
}
}
返回结果;
}
}


I have the following JSON snippets:

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

Notes that I don't know the name of randomlygeneratedKeyname and their naming convention is inconsistent so I could not create my corresponding Java field/variable names.

How do I (de)serialize it in GSON?

Thanks in advance for your help.

解决方案

Code dump solution:

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;
  }
}

这篇关于使用GSON处理随机生成的和不一致的JSON字段/键名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-02 23:24