Java parse JSON path value to variable



I have a problem. I had the following code to parse a JSON string to an object:

public AgentStrategy parseJsonToObject(String jsonString) {
    Gson gson = new Gson();
    AgentStrategy agent = gson.fromJson(jsonString, AgentStrategy.class);    
    return agent;
}

But now I have a JSON with values that are not equal to the attribute name. Here is the new JSON:

{
   "Market": "USDT",
   "Coin":"BTC",
   "ModuleEnabled":{
      "Patterns":{
         "Buy":"true",
         "Sell":"true"
      },
      "EMA":{
         "Buy":"true",
         "Sell":"false"
      }
   }
}

And this is what the class looks like:

public class AgentStrategy {

    public String Market;    
    public String Coin;

    public boolean ModuleEnabledBuyEMA;
    public boolean ModuleEnabledSellEMA;
    public boolean ModuleEnabledBuyPatterns;
    public boolean ModuleEnabledSellPatterns;

    public AgentStrategy parseJsonToObject(String jsonString) {
        Gson gson = new Gson();
        AgentStrategy agent = gson.fromJson(jsonString, AgentStrategy.class);

        return agent;
    }
}

Now how can I match the JSON and class as the following:

"ModuleEnabled" -> "EMA" -> "Buy" = ModuleEnabledBuyEMA
"ModuleEnabled" -> "EMA" -> "Sell" = ModuleEnabledSellEMA
"ModuleEnabled" -> "Patterns" -> "Buy" = ModuleEnabledBuyPatterns
"ModuleEnabled" -> "Patterns" -> "Sell" = ModuleEnabledSellPatterns

Answer

You can write a custom deserializer in which you use default Gson deserialization and additionally manually parse the “problematic” fields:

public class AgentStrategyDeserializer implements JsonDeserializer<AgentStrategy> {

    @Override
    public AgentStrategy deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {

        Gson gson = new Gson();
        AgentStrategy agent = gson.fromJson(jsonElement, AgentStrategy.class);
        // At this point only Market and Coin attributes are set. Since the booleans can not be parsed they are initialized to false

        JsonObject moduleEnabledJsonObject = jsonElement.getAsJsonObject().get("ModuleEnabled").getAsJsonObject();
        boolean moduleEnabledBuyPatterns = moduleEnabledJsonObject.get("Patterns").getAsJsonObject().get("Buy").getAsBoolean();
        boolean moduleEnabledSellPatterns = moduleEnabledJsonObject.get("Patterns").getAsJsonObject().get("Sell").getAsBoolean();
        boolean moduleEnabledBuyEMA = moduleEnabledJsonObject.get("EMA").getAsJsonObject().get("Buy").getAsBoolean();
        boolean moduleEnabledSellEMA = moduleEnabledJsonObject.get("EMA").getAsJsonObject().get("Sell").getAsBoolean();

        agent.setModuleEnabledBuyEMA(moduleEnabledBuyEMA);
        agent.setModuleEnabledSellEMA(moduleEnabledSellEMA);
        agent.setModuleEnabledBuyPatterns(moduleEnabledBuyPatterns);
        agent.setModuleEnabledSellPatterns(moduleEnabledSellPatterns);

        return agent;
    }
}

This is how you use the deserializer:

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(AgentStrategy.class, new AgentStrategyDeserializer());
    Gson gson = gsonBuilder.create();
    AgentStrategy agentStrategy = gson.fromJson(jsonString, AgentStrategy.class);


Source: stackoverflow