使用唯一键提取关联的JSON数据

时间:2017-10-24 14:20:41

标签: java json gwt smartgwt

我是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。*

由于 马丁

2 个答案:

答案 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);