2

例如,我有以下 JSON 的响应:

{
    response: {
        id: 20,
        name: Stas
    }
}

我想将其解析为以下对象:

class User {
    private int id;
    private String name;
}

如何跳过响应节点?

我使用 Google Http Java 客户端,如果有人能回答如何在那里做会很好。这条线将如何变化?

request.setParser(new JacksonFactory().createJsonObjectParser());
return request.execute().parseAs(getResultType());
4

3 回答 3

3

您现在可以一步实现:

new JsonObjectParser.Builder(jsonFactory)
    .setWrapperKeys(Arrays.asList("response"))
    .build()

http://javadoc.google-http-java-client.googlecode.com/hg/1.15.0-rc/index.html

于 2013-06-21T03:53:55.423 回答
2

我不知道 Google Http Java 客户端,但如果您可以访问 Jackson ObjectMapper,您可以执行以下操作:

1.)启用根解包:

objectMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);

2.)向 User.class添加注释:

@JsonRootName("response")
class User {
    …
}

我希望你可以使用这种方法。

编辑:我通过google-http-java-client API挖掘并得出结论,您无法直接访问 ObjectMapper。为了使用 Jackson 的全部功能,您必须编写自己的JsonObjectParser实现来包装“真正的”Jackson 解析器。对此感到抱歉,也许其他人可以提出更好的解决方案。

于 2013-02-20T09:15:36.770 回答
2

我没有找到一种本地方式(对于这个库)来解决我的任务。结果,我通过扩展JsonObjectParser的功能解决了这个问题。它需要扩展JacksonFactory,但它是最后一个类,所以我使用了聚合。

我写了以下课程:

  • 杰克逊过滤厂

    import com.google.api.client.json.JsonObjectParser;
    import com.google.api.client.json.jackson2.JacksonFactory;
    
    public class JacksonFilteringFactory {
        private final JacksonFactory factory = new JacksonFactory();
    
        public JsonObjectParser createJsonObjectParser(String filteringNode) {
            return new FilteringJsonObjectParser(factory, filteringNode);
        }
    }
    
  • 过滤JsonObjectParser

    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.lang.reflect.Type;
    import java.nio.charset.Charset;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    import org.json.JSONTokener;
    
    import com.google.api.client.json.JsonFactory;
    import com.google.api.client.json.JsonObjectParser;
    import com.vkredmessenger.AppController;
    import com.vkredmessenger.util.StringUtils;
    
    public class FilteringJsonObjectParser extends JsonObjectParser {
    
        private String mFilteringNode;
    
        public FilteringJsonObjectParser(JsonFactory jsonFactory, 
                String filteringNode) {
    
            super(jsonFactory);
    
            mFilteringNode = filteringNode;
        }
    
        @Override
        public Object parseAndClose(InputStream in, 
                Charset charset, Type dataType)
                    throws IOException {
    
            String originalResponse = 
                    StringUtils.convertStreamToString(in, charset);
    
            String response = null;
    
            try {
                JSONTokener tokener = new JSONTokener(originalResponse);
                JSONObject originalResponseObject = 
                        (JSONObject) tokener.nextValue();
    
                JSONObject responseObject = 
                        originalResponseObject.getJSONObject(mFilteringNode);
                response = responseObject.toString();
    
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
            InputStream filteredIn = 
                    new ByteArrayInputStream(response.getBytes(charset));
    
            return super.parseAndClose(filteredIn, charset, dataType);
        }
    }
    

因此,例如从我的问题中,结果解析代码将如下所示:

request.setParser(new JacksonFilteringFactory().createJsonObjectParser("response"));
return request.execute().parseAs(getResultType());
于 2013-02-20T18:03:40.360 回答