我们可以使用SuperObject库通过名称调用某个对象的方法,并使用SOINvoker方法将其参数作为json字符串给出,就像在这个答案中一样
我想知道如何将创建的对象作为参数发送.我试着像发送它一样
LObjectList := TObjectList.Create;
LSuperRttiCtx := TSuperRttiContext.Create;
LSuperObjectParameter := LObjectList.ToJson(LSuperRttiCtx);
SOInvoke(MyInstantiatedObject, 'MyMethod', LSuperObjectParameter);
Run Code Online (Sandbox Code Playgroud)
但在MyMethod内部,LObjectList引用丢失了.
我究竟做错了什么?
superobject库可以在这里下载
我正在使用Delphi 2010和superobject库.
我已经了解如何解析json文件,但我不知道如何创建json?
算法是:
需要一些例子.
谢谢.
我的服务器有以下JSON:
{
"userid":"12",
"username":"TestChar",
"logged":"yes",
"status":"Premium User",
"areas":{
"SERVICEAREA_XX1":{
"id":"1",
"area":"SERVICEAREA_XX1",
"version":"3000",
"usr_group":"0"
},
"SERVICEAREA_XX2":{
"id":"2",
"area":"SERVICEAREA_XX2",
"version":"31000",
"usr_group":"0"
},
"SERVICEAREA_XX3":{
"id":"3",
"area":"SERVICEAREA_XX3",
"version":"2000",
"usr_group":"1"
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用SuperObjects,我可以获得"SERVICEAREA"的计数
ob['areas'].AsObject.count
Run Code Online (Sandbox Code Playgroud)
我现在如何才能访问不同"SERVICEAREA"的元素?
谢谢你的帮助...
只是分享我使用Delphi SuperObject使用Json的经验
我的想法是如何轻松地将我的查询结果转换为json格式.
我使用字符串来表示所有数据格式(包括BLOB,DATE,DATETIME).将来,json文件可以轻松导入数据库.
我不是从头开始编写代码,我只是根据自己的需要进行了一些修改
这是代码:
function TTableJSon.CreateJsonValueByFieldMySql(Json: ISuperObject;
Field: TField): Boolean;
var
JsonTyp, FieldTyp : string;
tmpStr : string;
begin
Result := False;
if Field Is TDateField then begin
Json.O[Field.FieldName] := SO('"'+FormatDateTime('yyyy-mm-dd',Field.AsDateTime)+'"')
end else if Field Is TDateTimeField then begin
Json.O[Field.FieldName] := SO('"'+FormatDateTime('yyyy-mm-dd hh:nn:ss',Field.AsDateTime)+'"')
end else if Field is TMemoField then begin
Json.S[Field.FieldName] := EncodeString(Field.AsString)
end else if Field is TBlobField then begin
Json.S[Field.FieldName] := EncodeString(Field.AsString)
end else if Field is TFloatField then begin
Json.O[Field.FieldName] … 我正在尝试保存JSON,其中IP是关键.预期的JSON结果是:
{"SnmpManagers":[{"10.112.25.235":162}]}
Run Code Online (Sandbox Code Playgroud)
Delphi SuperObject代码:
const
IpAddr = '10.112.25.235';
Port = 162;
var
tmp: TSuperObject;
begin
tmp := TSuperObject.Create;
tmp.I[IpAddr] := Port;
Json.A['SnmpManagers'].Add(tmp);
end;
Run Code Online (Sandbox Code Playgroud)
SuperObject将点解析为JSON对象的路径分隔符:
{"SnmpManagers":[{"10":{"112":{"25":{"235":162}}}}]}
Run Code Online (Sandbox Code Playgroud)
如何使用SuperObject正确地将IP保存为JSON密钥?
我正在使用Delphi XE.
以下单元无法使用此错误进行编译:
[DCC Error] GTSJSONSerializer.pas(27): E2506 Method of parameterized type declared
in interface section must not use
local symbol 'TSuperRttiContext.AsJson<GTSJSONSerializer.TGTSJSONSerializer<T>.T>'
Run Code Online (Sandbox Code Playgroud)
这是为什么?有解决方法吗?
unit GTSJSONSerializer;
interface
type
TGTSJSONSerializer<T> = class
class function SerializeObjectToJSON(const aObject: T): string;
class function DeserializeJSONToObject(const aJSON: string): T;
end;
implementation
uses
SuperObject
;
class function TGTSJSONSerializer<T>.SerializeObjectToJSON(const aObject: T): string;
var
SRC: TSuperRttiContext;
begin
SRC := TSuperRttiContext.Create;
try
Result := SRC.AsJson<T>(aObject).AsString;
finally
SRC.Free;
end;
end;
class function TGTSJSONSerializer<T>.DeserializeJSONToObject(const aJSON: string): T;
var
LocalSO: ISuperObject;
SRC: TSuperRttiContext;
begin
SRC …Run Code Online (Sandbox Code Playgroud) 我有一个带有一些TObjectList <>的对象 - 我尝试使用帮助形式SuperObject编码为JSON的字段.
TLogs = TObjectList<TLog>;
TMyObject = class(TObject)
private
FLogs: TLogs;
end;
Run Code Online (Sandbox Code Playgroud)
在SuperObjects代码内部,有一个ToClass过程,迭代字段并将它们添加到json结果中.
在此循环中,检查TRttiFields FieldType.如果它为零,则跳过该对象.
for f in Context.GetType(Value.AsObject.ClassType).GetFields do
if f.FieldType <> nil then
begin
v := f.GetValue(value.AsObject);
result.AsObject[GetFieldName(f)] := ToJson(v, index);
end
Run Code Online (Sandbox Code Playgroud)
我的通用列表字段的FieldType为nil.为什么?
如何让SuperObject序列化我的对象列表?
我最近在解析JSON时遇到了问题.您可以看到,在使用CloudFlare Client Interface API时,我想查找特定IP的"威胁评级".问题是由于API的设计,格式是这样的;
{
response: {
xxx.xxx.xxx.xxx: <value>,
calls_left: 299
},
result: "success",
msg: null
}
Run Code Online (Sandbox Code Playgroud)
xxx.xxx.xxx.xxx表示从中检索数据所需的字段名称.马上,你可能会看到我面临的问题; 假设解析字符串中的点字符是当前路径中的子级别.
<value>代表IP的实际评级.但是,从它返回的格式和数据类型会有所不同.对于不是威胁的IP,或者没有威胁等级的IP,它将false作为布尔值返回.在搜索引擎爬虫上,它返回"SE:<var>"(其中<var>是数值)字符串.在已知威胁上,它返回"BAD:<var>"(其中<var>是数值).因此,我不能依赖于返回的已知数据类型.
然而,主要问题是,由于字段名称中的点,尝试从该字段读取值显然会失败.
如何从通用JSON获取所有'id'成员值.不知道它的结构.因为它非常复杂而且它有很多子对象.它必须循环遍历所有子对象.
对于那些继续询问JSON示例的人来说再次.我的问题是如何在我的案例"id"中从任何具有此成员的通用JSON中提取成员值.
我广泛使用SuperObjectJSON库.我需要能够检查对象中是否存在特定元素.我可以检查一个元素的值,例如一个不存在的整数返回0.但是,0如果它存在的话,它是可能的值之一 - 所以我不能依赖观察0元素的存在.我检查了ISuperObject可以做到这一点的for方法(例如我希望有类似的东西ISuperObject.Exists(const S: String): Boolean;),但是看不到这样的东西.
如何检查JSON对象中是否存在特定元素?
delphi ×10
superobject ×10
json ×8
generics ×2
rtti ×2
cloudflare ×1
delphi-xe ×1
delphi-xe2 ×1
firemonkey ×1
ip-address ×1
parsing ×1
reflection ×1