- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个使用 json.net 序列化库的 API。它使用 $ref 和 $id 字段进行循环引用。 RestKit 没有意识到这些 $ref 字段正在引用另一个已经序列化的对象。
有没有办法告诉 RestKit 使用这些字段以便不创建空对象?
这是我的 json 示例:
{
"$id":"1",
"WorkOrder":{
"$id":"2",
"Location":{
"$id":"3",
"Address":{
"$id":"4",
"Guid":"8086990f-13a0-4f93-8a9b-043ff247ae66"
},
"WorkOrders":[
{
"$ref":"2"
}
],
"Guid":"ae58698d-4fcf-4c31-82bf-529077b6d059"
},
"Appointments":[
{
"$ref":"1"
}
],
"Guid":"94140fc6-9885-4395-a79d-2b60452f2bf4",
},
"Calendar":{
"$id":"5",
"OwnerID":"1bbda60d-0bda-4b97-b6e5-24460106bc54",
"IsActive":true,
"Appointments":[
{
"$ref":"1"
}
],
"Guid":"e6c91678-290d-4d12-b52f-9f6ad36dd679",
},
"Guid":"731f20c6-6ecb-4515-ade3-df47bc929c86",
}
最佳答案
答案不在 RestKit 中,而在您的 JSON.Net 序列化中。以下是问题:
因此,为了实现这一点,我们需要使用 WCF 引用将对象从我们的服务层获取到我们的 API 层,然后创建我们自己的 json 序列化,仅使用对象的主键作为引用而不是 $ WCF 使用的 id $ref 废话。
所以,这里是详细信息。
首先,您将获得 $ref $id,因为您正在调用 WCF 服务,该服务的类装饰有 [DataContract(IsReference=true)]
属性。如果您还没有用 [JsonObject(IsReference=false)]
装饰您的类,JSON.Net 序列化程序将读取此属性并创建 $id、$ref 引用。您需要 DataContract IsReference 来让您的 WCF 服务将您的对象序列化到您的 ApiController。你的 ApiController 现在想要将对象序列化为 Json 到客户端......因此你的对象也需要 Json(IsReference=false) 来防止 $id, $ref
下面是数据模型类定义现在的样子
[JsonObject(IsReference=false)]
[DataContract(IsReference=true)]
public class SomeClassToSerialize
DataContract 来自 System.Runtime.Serialization 库JsonObject 来自 NewtonSoft.Json 库
好的...这已经解决了一半。此时,我们将使用 WCF 引用将服务中的对象返回给我们的 api。我们已经告诉我们的 API 不要使用引用,所以我们的 API 服务现在会因堆栈溢出而崩溃,因为它会尝试序列化循环引用。
下一步是创建一个自定义 JsonConverter
,它将仅使用主键呈现循环引用。在下面的示例中,我所有的对象都继承自 EntityBase。而这一切的主键就是一个叫做Guid的Guid。所以,这是逻辑......
跟踪 HashSet 中的所有渲染对象。如果尚未渲染对象,则循环遍历每个属性并渲染对象。如果已呈现对象,则仅呈现主键 (Guid)。
public class GuidRefJsonConverter : JsonConverter
{
public override bool CanRead { get { return false; } }
public override bool CanWrite { get { return true; } }
public override bool CanConvert(Type objectType)
{
return typeof(EntityBase).IsAssignableFrom(objectType);
}
private HashSet<EntityBase> serializedObjects = new HashSet<EntityBase>();
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
EntityBase eb = (EntityBase)value;
JObject jo = new JObject();
jo.Add("Guid", eb.Guid.ToString());
if (serializedObjects.Add(eb))
{
foreach (PropertyInfo prop in value.GetType().GetProperties())
{
if (prop.GetCustomAttribute<JsonIgnoreAttribute>() != null) continue;
if (prop.CanRead)
{
object propVal = prop.GetValue(value);
if (propVal != null && prop.Name!="Guid")
{
jo.Add(prop.Name, JToken.FromObject(propVal, serializer));
}
}
}
}
jo.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
最后,我们只需要注册我们的 JsonConverter。在 WebApiConfig.Register() 方法中,只需注册序列化程序。
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.Converters=new List<JsonConverter>(){new GuidRefJsonConverter()};
就是这样。 API 现在将仅使用主键序列化一个循环引用,RestKit 会将其作为一个空更新插入,并将正确映射其所有指针。
关于ios - 如何使用 $ref 和 $id 在 RestKit 中使用循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21126910/
我使用 RestKit 与 REST api 进行交互。对于某些操作,例如 HTTP PUT/POST/DELETE,我只关心响应状态代码(200 或 500 等),而不关心响应数据,即使 API 确
我在客户端和服务器端都有一个这样的响应对象: 客户端: //BaseResponse.h @interface BaseResponse : NSObject{ NSString *code;
我正在尝试将 RestKit 0.20 集成到我的项目中,例如,我使用 google rss 阅读器作为示例项目。 这是对 Xml 的响应 / /类别> & 这是我必须从中获取数据的 Xml。 RKO
我很难使用 CocoaPods 将 RestKit 安装到我的项目中。我收到未找到的错误。 我的 Pods.xcconfig 看起来像这样: GCC_PREPROCESSOR_DEFINITIONS
大多数 RESTful API 都会路由对资源的访问,例如 Rabbit 对象,如下所示: GET /rabbits <--- GET all rabbits.
问题 在 iOS 上完成 Restkit 的安装说明后,我收到 Apple Mach-o 链接器错误: 我的流程 我尝试按照此处的 Restkit 安装说明进行操作:https://github.co
我完全按照此处找到的这些步骤操作: http://www.raywenderlich.com/13097/intro-to-restkit-tutorial 但是....我得到了错误: 这可能是什么原
我正在尝试使用 RestKit 调用需要基本身份验证的端点。 RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[JSNCateg
我想用RestKit ,但我已经使用 Realm.io而不是 CoreData。 是否可以在 Realm.io 之上使用 RestKit? 最佳答案 你当然可以。从 RestKit 取回对象后: //
我没有找到任何方法来设置 restkit 0.20.0 的超时间隔。 任何人都可以帮助增加超时间隔。 谢谢 最佳答案 子类 RKHTTPRequestOperation 和实现方法 - (NSURLR
我正在尝试实现 RESTKit 0.20 操作队列,我在博客上读到 NSOperationQueue 也可用于创建操作队列。我想使用 RestKit 操作队列的 native 方法。 任何人都可以发布
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 8年前关闭。 Improve thi
我在这里做的事情很奇怪吗? 我的类别得到下载和映射, 产品也像日志记录所说的那样被下载和映射, 但是我的产品在每个分类下都是空的,谢谢! { "productsCategories" : [
我尝试了几乎所有的解决方案,但都不适合我。我在 Xcode 6 上收到此错误。我也更新了 cocoa pod ,也更新了 pod 文件。 安装更新后,我在下面添加了几行: [!] From now o
我正在尝试使用 Jenkins-CI 自动构建一个使用 Restkit 的 iOS 项目,显然,restkit 作为一个项目驻留在主项目中。该项目使用 XCode-IDE 成功构建。 但是当我使用 x
我在 Xcode 6.1 中开发项目。它工作正常,突然提示错误“未找到 Restkit/Restkit.h 文件”。从 $ 更改Architectures 后出现错误(ARCHS_STANDARD_3
我按照 github 上的说明进行操作页面但有问题(肯定是我:P)但是,您知道在 Xcode4 RestKit 中集成/使用的任何好的教程吗? 谢谢! 最佳答案 从此链接下载最新版本 http://r
我在尝试让 RestKit 构建和工作时遇到了麻烦。我收到可怕的“词法或预处理器问题:未找到 RestKit/RestKit.h 文件”消息。我使用 Xcode 4.2,我的项目适用于 iOS。 早些
RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:BASE_URL]]; PPPS
有没有办法使用对象管理器访问请求的成功块中的响应数据? [objectManager postObject:[User class] path:@"/users" parameters:nil suc
我是一名优秀的程序员,十分优秀!