- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
DELPHI中如何将JObject转为TJavaArray?
这个方法我试过了,没有结果
var
jvObject: JObject;
jvArray: TJavaArray<byte>;
begin
jvArray:= TJavaArray<byte>(jvObject);
因为 jvArray 的结果是nil。
有人知道如何解决此转换吗?
最佳答案
我认为,在 Java 术语中,您要求的是序列化对象。
这是一个可以解决问题的单元:
unit SerialiseU;
interface
uses
Androidapi.JNI.JavaTypes,
Androidapi.JNIBridge;
//References:
// http://docs.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html
// http://stackoverflow.com/questions/5837698#5837739
type
TSerialiser = class
public
class function Serialise(const Obj: JObject): TJavaArray<Byte>;
class function Deserialise(Bytes: TJavaArray<Byte>): JObject;
end;
implementation
// Delphi XE5 and later (all Android-supporting versions) offer an
// import for java.io.ByteArrayOutputStream and java.io.ByteArrayInputStream
// in Androidapi.JNI.JavaTypes.pas.
// However neither java.io.ObjectInputStream nor java.io.ObjectOutputStream
// are imported in any version up to the current (at time of writing) version,
// Delphi 10.1 Berlin, so we import the bits we need here.
type
// ===== Forward declarations =====
JObjectInputStream = interface;//java.io.ObjectInputStream
JObjectOutputStream = interface;//java.io.ObjectOutputStream
// ===== Interface declarations =====
JObjectInputStreamClass = interface(JInputStreamClass)
['{443A1BEF-E21F-4012-A28B-4D7735136BD3}']
{class} function init(input: JInputStream): JObjectInputStream; cdecl;//Deprecated
end;
[JavaSignature('java/io/ObjectInputStream')]
JObjectInputStream = interface(JInputStream)
['{C1360ABB-AF58-4607-B43E-C1E1652E8FC2}']
function readObject: JObject; cdecl;//Deprecated
end;
TJObjectInputStream = class(TJavaGenericImport<JObjectInputStreamClass, JObjectInputStream>) end;
JObjectOutputStreamClass = interface(JOutputStreamClass)
['{D43CF30C-1E94-4D2E-A473-91EE54E41F07}']
{class} function init(output: JOutputStream): JObjectOutputStream; cdecl;//Deprecated
end;
[JavaSignature('java/io/ObjectOutputStream')]
JObjectOutputStream = interface(JOutputStream)
['{F4E441F8-B3D0-4463-A052-880F6644FB42}']
procedure writeObject(&object: JObject); cdecl;
end;
TJObjectOutputStream = class(TJavaGenericImport<JObjectOutputStreamClass, JObjectOutputStream>) end;
{ TSerialiser }
class function TSerialiser.Serialise(const Obj: JObject): TJavaArray<Byte>;
var
b: JByteArrayOutputStream;
o: JObjectOutputStream;
begin
b := TJByteArrayOutputStream.Create;
o := TJObjectOutputStream.JavaClass.init(b);
o.writeObject(Obj);
Result := b.toByteArray;
end;
class function TSerialiser.Deserialise(Bytes: TJavaArray<Byte>): JObject;
var
b: JByteArrayInputStream;
o: JObjectInputStream;
begin
b := TJByteArrayInputStream.JavaClass.Init(Bytes);
o := TJObjectInputStream.JavaClass.init(b);
Result := o.readObject;
end;
end.
可以这样使用:
uses
SerialiseU,
Androidapi.Helpers,
Androidapi.JNIBridge,
Androidapi.JNI.JavaTypes;
...
var
S, S2: String;
JS, JS2: JString;
O: JObject;
Bytes: TJavaArray<Byte>;
...
// Get some Java object. In this case it is a Java java.lang.String object
// http://d.android.com/reference/java/lang/String.html
S := Edit1.Text;
JS := StringToJString(S);
// Serialise the string into a byte array
Bytes := TSerialiser.Serialise(JS);
// Now de-serialise the byte array back to an object
O := TSerialiser.Deserialise(Bytes);
// Prove that the correct object type has been de-serialised
ShowMessageFmt('Deserialised a %s object',
[JStringToString(O.getClass.getCanonicalName)]);
// Cast the generic object back to a Java string
JS2 := TJString.Wrap(O);
// Get a Delphi string out, just to dot the 'i's and cross the 't's
S2 := JStringToString(JS2);
// Put the extracted string back on the UI so we can prove it all worked
Edit1.Text := S2;
end;
关于java - DELPHI中如何将JObject转换为TJavaArray<byte>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32679085/
我有一个像这样的 json 结构: var json = { "report": {}, "expense": {}, "invoices": {}, "projects": {},
实际上,我正在处理从 Framework 3.5 中的旧 VB.NET 项目中的某个 API 获取的一些 JSON 数据 我被困在以下响应的处理中: { "data": { "89359"
我使用 json.net 比较流利,但我正在努力以一种直接的方式提取这个值。 我觉得 json.net 应该能够推断出我正在尝试做什么,这样我就不必为了获得我想要的东西而在整个过程中进行每一步。 下面
我有下面的 Java 代码,其中 Array 是一个自定义对象。 public native int pax_store_get_data_avail_info(DataAvailable[] sta
我尝试查找上述比较,但找不到答案。 因为有多种方法可以获取 JObject(或所有继承自 JToken 的子类型)例如: Method1 . JObject.FromObject(obj); Meth
我有一个变量 projectData,它包含存储在数据库中的有效 json 字符串。 完成以下操作后: JObject obj = new JObject(); obj = JObject.Parse
我有 2 个情景来说明这个问题。 场景一 using System; using Newtonsoft.Json.Linq; public class Program { public sta
我有一个像这样的 JObject: JObject grid = new JObject( new JProperty("myprop", "value
当我尝试解析一个大约有 200mb 的大型 json 文件时遇到问题。我正在用 Newtonsoft.Json 来做这件事。它给出了 OutOfMemory 异常。 这是我的代码: using (St
我正在尝试创建 JObject 的扩展类,它是不可变的。 如果我创建一个如下所示的类,它可以防止实际的 JObject 被修改吗? public class ImmutableJObejct: JOb
我试过了 JObject obj = new JObject(); obj["item1"] = new string[] {"a","b"}; 得到了 Cannot implicitly conv
我有一个 json 字符串,需要转换为 JObject。 例子: String result = ""{"totalSize":1,"done":true,"records":[{"attribute
这个问题在这里已经有了答案: Merge two Json.NET arrays by concatenating contained elements (3 个答案) 关闭 6 年前。 我有第一个
我正在尝试使用 JObject 创建一个像这样的 json 对象: { "input": { "webpage/url": "http://google.com/" }
我有一个使用 LINQ to JSON 构建的 JObject(我正在使用 Json.Net)(也由同一个库提供)。当我在 JObject 上调用 ToString() 方法时,它会将结果输出为格式化
我有一个包含以下内容的 XYZ.Json 文件。 { "ABC": "Account", "CDE": "Balance", "EFG": "Enquiry" } 我尝试使用以下代码从这个
我正在为 Cosmos DB(基于文档或 JSON 的 DB)创建数据库播种器。一些 C# 模型的属性 Config 是 JSON,所以我一直在使用这种类型的代码来设置该属性: Config = JO
概括: 借助美国教育部 API,我计划为计算机科学专业的毕业生创建一个大学列表和工资中位数。但是,许多学校都有空值,并且尝试删除空值会破坏代码,因为您无法在枚举时修改集合。 我的 denullifie
我有一个 JObject 项目,如下所示: { "part": { "values": ["engine","body","door"]
我有以下代码: JToken hours = jToken["hours"]; 它返回以下 JSON: { "monday": [ ["11:00", "21:30"]
我是一名优秀的程序员,十分优秀!