我是Java新手并使用了
中提供的长段代码https://github.com/marklogic-community/marklogic-data-hub
阅读类似于原始发帖人员布局的json。
我的布局如下:
{
"messagedata": [
{
"msgkey": "12552",
"reference": "201708010001",
"bic": "PARABLULLEISI",
"securityid": "BE0003735496",
"safekeepingacc": "7744085P"
},
{
"msgkey": "12553",
"reference": "000081676368",
"bic": "PARABLULLEISX",
"securityid": "CNE00000BQ0",
"safekeepingacc": "1053542760H"
}
]
}
但最后一行代码(jsonString.stringValue())只读取第一个JSON数据块,即第一部分的msgkey或bic。
我如何从其他部分获取数据,即如果有3个部分,每个部分包含msgkey,bic,reference等
更重要的是,如果我知道示例JSON中的 msgkey 值,那么当msgkey值发生变化时,如何获取该部分的其他关联值?
我已经使用了库 com.google.gwt.json.client。*
由于 马丁
答案 0 :(得分:1)
您可以在GWT 2.8 + elemental2中使用JsInterop和JSON.parse。
import com.google.gwt.core.client.EntryPoint;
import elemental2.core.Global;
import elemental2.dom.DomGlobal;
import java.util.stream.Stream;
import jsinterop.annotations.*;
import jsinterop.base.Js;
class JsInteropExample implements EntryPoint {
@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
static class Message {
public Data[] messagedata;
}
@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
static class Data {
public String msgkey;
public String reference;
public String bic;
public String securityid;
public String safekeepingacc;
}
@Override public void onModuleLoad() {
Message msg = Js.cast(Global.JSON.parse("{\"messagedata\": […]}"));
Stream.of(msg.messagedata).forEach(d -> DomGlobal.console.log(d.msgkey));
}
}
答案 1 :(得分:1)
我完全同意Ignacio,JsInterop就是这样,这就是我询问GWT版本的原因。
JsInterop会自动将getter和setter映射到正确的属性,如下所示。
它还允许您将java叠加方法添加到您的本机对象中,我个人觉得非常方便和干净。
为了使此代码正常工作,您需要确保在gwt.xml文件中导入了elemental2和jsinterop。
import com.google.gwt.core.client.EntryPoint;
import elemental2.core.Global;
import elemental2.dom.DomGlobal;
import java.util.stream.Stream;
import jsinterop.annotations.*;
import jsinterop.base.Js;
class JsInteropExample implements EntryPoint {
@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
static abstract class Message {
@JsProperty
public abstract Data[] getMessagedata();
@JsOverlay
public void logObject(){
Stream.of(getMessagedata).forEach(d -> DomGlobal.console.log(d.msgkey));
}
}
@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
static class Data {
public String msgkey;
public String reference;
public String bic;
public String securityid;
public String safekeepingacc;
}
@Override public void onModuleLoad() {
Message msg = Js.cast(Global.JSON.parse("{\"messagedata\": […]}"));
Stream.of(msg.messagedata).forEach(d -> DomGlobal.console.log(d.msgkey));
}
}
如果你想避免使用elemental2,你可以使用:
解码Json@JsMethod(namespace="JSON")
static native DivData parse(String json);