开发者

Getting both JSONObject and Google Gson feature in a single library

I was wondering, is there any JSON library which enable me

  1. Get a key to value map, out from JSON String (JSONObject able to do this)
  2. Get a Java object, out from JSON String (Google Gson able to do this)

The following both print value

package jsontest;

import com.google.gson.Gson;
import org.json.JSONException;
import org.json.JSONObject;

/**
 *
 * @author yccheok
 */
public class Main {

    public static class Me {
        public String key;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws JSONException {

        final String s = "{\"key\" : \"value\"}";

        // Feature 1
        final JSONObject jsonObject = new JSONObject("{\"key\" : \"value\"}");
        System.out.println(jsonObject.getString("key"));

        // Feat开发者_开发百科ure 2
        Gson gson = new Gson();
        Me me = gson.fromJson(s, Me.class);
        System.out.println(me.key);
    }
}

Currently, I have to use 2 different libraries to achieve the above JSON related task. Is there any libraries which able to do both 2 tasks?


You can use Jackson.

It has a databinding solution (like Gson) and a tree model view (like JSONObject)

import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;

import java.io.IOException;

public class Main {

    public static class Me {
        public String key;
    }

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        String json = "{\"key\" : \"value\"}";

        // Feature 1
        JsonNode rootNode = mapper.readValue(json, JsonNode.class);
        System.out.println(rootNode.get("key").getTextValue());

        // Feature 2
        Me value = mapper.readValue(json, Me.class);
        System.out.println(value.key);
    }
}


I don't know how I missed this the first time, but you can do this in Gson using its JsonParser:

 JsonParser parser = new JsonParser();
 JsonElement rootElement = parser.parse(reader);

Previous answer (no need to do this)

I'm not sure if Gson has some easier built in way to do this, but this seems to work:

public enum JsonElementDeserializer implements JsonDeserializer<JsonElement> {
  INSTANCE;

  public JsonElement deserialize(
      JsonElement json, Type typeOfT, JsonDeserializationContext context) 
      throws JsonParseException {
    return json;
  }
}

And then:

Gson gson = new GsonBuilder().registerTypeAdapter(JsonElement.class,
    JsonElementDeserializer.INSTANCE).create();
JsonElement rootElement = gson.fromJson(reader, JsonElement.class);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜