以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]如何使用json返回的数组?  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=39976)

--  作者:智友软件工作室
--  发布时间:2013/9/5 20:06:00
--  [求助]如何使用json返回的数组?
{
    "face": [
        {
            "attribute": {
                "age": {
                    "range": 5, 
                    "value": 12.5
                }, 
                "gender": {
                    "confidence": 60.6197, 
                    "value": "Female"
                }, 
                "race": {
                    "confidence": 99.9178, 
                    "value": "Asian"
                }, 
                "smiling": {
                    "value": 93.8853
                }
            }, 
            "face_id": "199d1efd19ce4ee67a7ec7655f859b1a", 
            "position": {
                "center": {
                    "x": 49.285714, 
                    "y": 18.5
                }, 
                "eye_left": {
                    "x": 44.718571, 
                    "y": 15.424933
                }, 
                "eye_right": {
                    "x": 53.37881, 
                    "y": 14.9466
                }, 
                "height": 11.666667, 
                "mouth_left": {
                    "x": 45.677381, 
                    "y": 22.597167
                }, 
                "mouth_right": {
                    "x": 51.64, 
                    "y": 22.462333
                }, 
                "nose": {
                    "x": 48.300714, 
                    "y": 19.778667
                }, 
                "width": 16.666667
            }, 
            "tag": ""
        }
    ], 
    "img_height": 1140, 
    "img_id": "892280e2a4b36175fea0b4377d635c51", 
    "img_width": 798, 
    "session_id": "02c0b5df1c6c4f59b80d10f80e3e7cfc", 
    "url": "http://faceplusplus.com/static/img/demo/1.jpg"
}

我用这个:
Dim key As String = e.Form.Controls("TextBox1").value
Dim secret As String = e.Form.Controls("TextBox2").value
Dim url As String = e.Form.Controls("TextBox3").value
Dim XMLH As Object
XMLH = CreateObject("Microsoft.XMLHTTP")
XMLH.open("GET", "https://apicn.faceplusplus.com/v2/detection/detect?url=" & url & "&api_secret=" & secret & "&api_key=" & key, True)   \'获得实时信息
XMLH.send(Nothing)
Do While XMLH.readyState <> 4
    Application.DoEvents
Loop
\'把数据json数据转化成对象
Dim json As String = XMLH.responseText
Dim ScriptControl As Object,data As Object,JscriptCode As String
JscriptCode = "function toObject(json) {eval(""var o=""+json);return o;}"
ScriptControl = CreateObject("MSScriptControl.ScriptControl")
With ScriptControl
    .Language = "Javascript"
    .Timeout = -1
    .AddCode(JscriptCode)
    data = .Run("toObject", json)
End With

MessageBox.Show(json)
e.Form.Controls("Label1").text = "img_height:" & data.img_height
e.Form.Controls("Label2").text = "img_width:" & data.img_width
e.Form.Controls("Label3").text = "img_id:" & data.img_id
e.Form.Controls("Label4").text = "session_id:" & data.session_id
e.Form.Controls("Label5").text = "url:" & data.url

已经读取了除face中的内容了。

请问如何读取这个face数组呢?

--  作者:智友软件工作室
--  发布时间:2013/9/5 20:07:00
--  
对于face数组困惑中.......
--  作者:有点甜
--  发布时间:2013/9/5 20:46:00
--  
 直接获取不行么?

 data.face(0).attribute.age.range

--  作者:智友软件工作室
--  发布时间:2013/9/5 21:15:00
--  
data.face(0).attribute.age.range
这样直接引用会报错的,是不是要处理一下这个数组???

--  作者:智友软件工作室
--  发布时间:2013/9/5 21:44:00
--  
data.face.length
用上述代码能够得到值为1.
但是还是不会引用呢??
求指教,着急啊!

--  作者:智友软件工作室
--  发布时间:2013/9/5 21:52:00
--  
谁帮我看看啊


--  作者:有点甜
--  发布时间:2013/9/5 22:11:00
--  
 测试了很多下,查询了好些资料,发觉不能够,所以这样如下处理,自己判断下标去取值。

Dim s As String = "{\'face\':[{\'a\':\'a\'}, {\'b\':{\'bb\':\'bb\'}}], \'test\':\'test\'}"
Dim json As String = s
Dim ScriptControl As Object,data As Object,JscriptCode As String
JscriptCode = "function toObject(json) {eval(""var o=""+json);return o;}"
ScriptControl = CreateObject("MSScriptControl.ScriptControl")
With ScriptControl
    .Language = "Javascript"
    .Timeout = -1
    .AddCode(JscriptCode)
    data = .Run("toObject", json)
End With

Dim count As Integer = 0
For Each i As object In data.face
    If count = 1 Then
        msgbox(i.b.bb)
    End If
    count += 1
Next

--  作者:智友软件工作室
--  发布时间:2013/9/5 22:22:00
--  
e.Form.Controls("Label1").text = "img_height:" & data.img_height
e.Form.Controls("Label2").text = "img_width:" & data.img_width
e.Form.Controls("Label3").text = "img_id:" & data.img_id
e.Form.Controls("Label4").text = "session_id:" & data.session_id
e.Form.Controls("Label5").text = "url:" & data.url
请问上述的这个已经能读取出来的和你写的代码有冲突吗?还需要动吗?是不是您写的专门是针对face这个数组的呢?

--  作者:有点甜
--  发布时间:2013/9/5 22:35:00
--  
 我只是做一个例子,楼主,你可以直接运行代码的。
--  作者:有点甜
--  发布时间:2013/9/5 22:36:00
--  
 比如你要获取 data.face(0).attribute.age.range

Dim count As Integer = 0
For Each o As object In data.face
    If count = 0 Then
        msgbox(o.attribute.age.range)
    End If
    count += 1
Next