繁体   English   中英

如何将具有各种元素的JSON数组传递给http有效负载?

[英]How to pass a JSON array with various elements to a http payload?

我正在尝试为ToodleDo API v3开发WSO2 ESB连接器。 在该API中,我需要添加带有各种参数的任务数组。 数组的一个元素中的参数数量可以与其他元素不同。 API调用如下所示。

http://api.toodledo.com/3/tasks/add.php
    access_token=yourtoken
    tasks=[{"title"%3A"My Task"}%2C{"title"%3A"Another"%2C"star"%3A"1"%2C"ref"%3A"98765"}%2C{"title"%3A""%2C"ref"%3A"1234"}]
    fields=folder,star

通过创建JSON对象并将POST提交到API来添加任务。 另外,在通过URL传输之前,我还需要对数据进行编码。

我尝试使用javascript进行此操作。 我只是尝试使用数组中的两个参数(强制性-title和可选的-star)。 我的代码如下。

    var added = 0;
    var query = "";

    var taskString = '{"tasks":' + mc.getProperty('uri.var.tasks') + '}';

   if (mc.getProperty('uri.var.tasks') != null && mc.getProperty('uri.var.tasks') != "") {

        var taskObj = eval ("(" + taskString + ")");

        if(Boolean(added)) {
            query = query + ',"tasks":[';
        }else {
            query = query + '"tasks":[';
            added = 1;
        }

        var count = 0;
        for (var i in taskObj.tasks) {
            if (taskObj.tasks.hasOwnProperty(i)) {
                if(count == 0 ) {
                    query=query + '{\"title\":\"'+mc.getProperty('uri.var.title')+'\",';
                    query=query + '{\"star\":\"'+mc.getProperty('uri.var.star')+'\"}';
                    count =1;
                }else {
                    query=query + ',{\"title\":\"'+mc.getProperty('uri.var.title')+'\",';
                    query=query + '{\"star\":\"'+mc.getProperty('uri.var.star')+'\"}';
                }

            }
        }

        query = query + ']';

        var encoded_query= encodeURIComponent(query);
    }
    mc.setProperty('uri.var.encoded_query', encoded_query);

]]>
</script>

而且我已经写了如下的有效负载工厂。

<payloadFactory media-type="xml">
            <format>
                <xform>
                    <access_token>$1</access_token>
                    <tasks>$2</tasks>
                    <fields>$3</fields>
                </xform>
                <!--{
                    "access_token" : "$1",
                    "tasks" : "$2"
                    "fields" : "$3"
                }-->
            </format>
            <args>
                <arg expression="$func:access_token" />
                <arg expression="get-property('uri.var.encoded_query')" />
                <arg expression="$func:fields" />
            </args>
</payloadFactory>

但这给了我以下错误。

[2014-09-10 22:39:22,129] ERROR - SynapseJsonPath #stringValueOf. Error evaluating JSON Path <$.access_token>. Returning empty result. Error>>> Unexpected character ({) at position 96.
[2014-09-10 22:39:22,130] ERROR - SynapseJsonPath #stringValueOf. Error evaluating JSON Path <$.tasks>. Returning empty result. Error>>> Unexpected character ({) at position 96.
[2014-09-10 22:39:22,130] ERROR - SynapseJsonPath #stringValueOf. Error evaluating JSON Path <$.fields>. Returning empty result. Error>>> Unexpected character ({) at position 96.
[2014-09-10 22:39:22,132] ERROR - ScriptMediator Failed to get the JSON payload from the input stream. Error>>>
com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 101

我想念什么? 如何修改它以使用所有可选参数?

您可以在字典中添加必填字段,然后在该字典上调用JSON.stringify以获取所需的JSON对象。

var field = {};
field['key'] = 'value';

然后,使用Ajax Query可以将数据固定在有效负载中。

$.ajax({
        type : "POST",
        url : url,
        data : JSON.stringify(field),
        dataType : "json",
        success : alert('success'),
        error: alert('error')
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM