- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
好的,所以我编辑了问题,因为它不够清楚。
编辑 2:更新了 JSON 文件。
我在 Android 应用程序中使用 GSON,我需要解析来自服务器的 JSON 文件,这些文件有点太复杂了。我不想让我的对象结构太重,所以我想简化内容:所以我的对象结构不会是 JSON 文件的结构。
例如,如果在 JSON 中我有这个:
{
"object1":{
"attribute1" : "test1",
"attribute40" : "test40",
"user":{
"id":1,
"name":"foo"
}
,"example":{
"total":10,
"list":[
{
"tag":"tag1",
"name":"object name 1",
"pos":1
},
{
"tag":"tag10",
"name":"object name 10",
"pos":10
}
]
}
}
"object2":{
"attribute1":"test..."
}
}
我不想在我当前的对象结构中保留一个对象 Example
,它包含一个 ArrayList
和一个 int
"total ”。但我只想保留一个简单的字符串,其值为 "object name 1;object name 2;..."
。
此外,我只想存储用户 ID,而不是完整的用户,因为我已经通过其他服务器 API 调用将完整的用户存储在其他地方。
所以我的类(class)会是这样的:
class Foo{
int userId;
String example; //"object name 1;object name 2;..."
...
}
所以我想我们可以使用自定义反序列化器来实现这一点,但我不知道如何实现。我希望尽可能减少内存,所以我不认为拥有一个完整的对象示例,然后使用它来构建我的 String example
是正确的方法。
在最坏的情况下,如果它太复杂,我希望在解析示例对象时至少能够存储标签项列表:所以我需要一个自定义反序列化器来摆脱 int 总计
。
所以我会:
class Foo{
int userId;
ArrayList<Tag> example;
...
}
最佳答案
我采用了答案来展示在聊天中设计的完整解决方案并适应更改后的 JSON 字符串。该代码假定字符串 json 恰好包含问题中的(更新的)JSON。要求是填写以下类(省略setter和toString):
class Object1
{
private String attribute1;
private String attribute40;
private int userId;
private String nameList;
}
GSON 支持(与大多数其他 REST-libs 一样)三种模式:
JsonParser.parse()
读取整个 JSON 并在内存中构建 DOM 树(对象模型访问)。因此,此解决方案适用于小型 JSON 文件。JsonReader
只读取 JSON block 。代码比较复杂,但适用于大型 JSON 文件。从 Android 3.0 Honeycomb 开始,GSON 的流解析器包含在 android.util.JsonReader
中。要通过 GSON_DOM 和 GSON_BIND 填充类 Object1,实现如下所示:
private static void deserializeViaObjectAccess(final String json)
{
Gson gson = new Gson();
// Read the whole JSON into meomory via GSON_DOM
JsonParser parser = new JsonParser();
JsonObject object1 = parser.parse(json).getAsJsonObject().getAsJsonObject("object1");
// map the Object1 class via GSON_BIND
// (bind common attributes which exist in JSON and as properties in the class)
// mapper acts as factory
Object1 result = gson.fromJson(object1, Object1.class);
// manually read the attribute from the user object
int userId = object1.getAsJsonObject("user").getAsJsonPrimitive("id").getAsInt();
result.setUserId(userId);
// manually read the attributes from the example object
String names = "";
JsonArray list = object1.getAsJsonObject("example").getAsJsonArray("list");
for (int i = 0; i < list.size(); ++i)
{
JsonObject entry = list.get(i).getAsJsonObject();
String name = entry.getAsJsonPrimitive("name").getAsString();
names = i == 0 ? name : names + "; " + name;
}
result.setNameList(names);
// Output the result
log.debug(result.toString());
}
要通过 GSON_STREAM 和 GSON_BIND 填充类 Object1,实现如下所示:
At the moment, this is only possible when a node is completly loaded via GSON_BIND or GSON_STREAM. This example needs that a node itself should be splitted. This is only possible with the upcoming version 2.2. I will hand the code in later when GSON 2.2 is available.*
关于java - GSON : custom object deserialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8533020/
我在大学学习C++时学习了这段代码..后来我在C#中使用了同样的东西...但现在我想在Java中使用它...我在互联网上寻找类似的东西,但我什至不知道如何表达它,以便我得到正确的结果。 所以嗯,请让我
我正在我的 Ruby on Rails Controller 上运行 RSPEC 测试,这是我正在测试的 Controller 操作: Controller 代码: class Customers::
想为我选择的选项卡设置自定义背景,到目前为止,子类化是我自定义 UITAbBar/UITabBarItem 的方式。 问题是:有谁知道(或知道我在哪里可以找到)设置背景的属性是什么? 所选选项卡周围有
您好,我在 commerefacades-beans.xml 中创建了 eProductForm bean,我添加了 ProductData 的自定义属性。 然后在commercewebs
我有两个表:1. 客户2. customer_order 客户表包含客户数据(duh),customer_order 包含所有订单。我可以在 customer.id=customer_order.id
在我的 TableView 中,我有一个 NSMutableArray *currList 的数据源 - 它包含对象 Agent 的对象。我创建了自定义的 TableCell 并正确设置了所有内容。我
是否建议使用自引用泛型继承? public abstract class Entity { public Guid Id {get; set;} public int Version
我正在尝试为我的 Grafana 安装使用自定义文件 ( custom.ini )。不幸的是,这不起作用。 我做了什么: 安装了一台装有 CentOS 7 的虚拟机 添加了 Grafana Yum R
我被分配了两个给定类的作业,一个是抽象父类 Lot.java,另一个是测试类 TestLots.java。我不应该编辑其中任何一个。任务是创建Lot的两个子类,使TestLots中的错误不再是错误。
我是 Botpress 的新手。 我刚刚安装了 Botpress 的最新版本“botpress-ce-v11_0_1-win-x64”。 我浏览了文档,发现了一些关于内容类型、内容元素和内容渲染的解释
我一直在四处寻找,但我还没有找到任何东西,除了 Qt3 的旧文档和 qt 设计器的 3.x 版。 我会举个例子,并不是因为我的项目是 GPL 而不能提供代码,而是为了简单起见。 示例:您正在为您的应用
场景 我有一个自定义规则来验证订单的运费: public class OrderValidator : BaseValidator { private string CustomInfo {
我有用于身份验证的自定义拦截器: @Named("authInterceptor") @Provides @Singleton fun providesAuthIntercep
如果有人没有添加照片,我想显示默认头像图像。我假设我需要在模型或助手中执行自定义 getter。 如果我做 getter,它会看起来像这样吗: def avatar_url "default_ur
我正在使用 Google Search API,但遇到了一些麻烦。这个请求(在 Python 中,使用 requests 库)工作正常 res = requests.get("https://www.
我使用 MSKLC 制作了自定义键盘布局。 我以为我仔细按照说明操作了chose appropriate values对于LOCALENAME和 LOCALID参数。 但是,在通过按 Win+Spac
我正在使用 simpleframework解析 XML 字符串并将其转换为对象。 Serializer serializer = new Persister(); try { Customer
我正在使用 C# 控制台应用程序从 MySql 数据库获取一些数据,但在正确查询时遇到一些问题 现在的情况: SELECT * FROM Customer WHERE EXISTS ( SELECT
我在我的 iPhone 4S 上运行我的应用程序,我正在使用自定义表格 View Controller 和自定义表格 View 单元格,当我将表格 View 向上滑动到空白区域并同样向下滑动到空白区域
我有一个自定义的 JavaScript 变量,它正在检查 eventAction 是什么,这样我就可以知道是否触发一些转换像素。自定义 Javascript 称为“FacebookConversion
我是一名优秀的程序员,十分优秀!