Foxtable(狐表)用户栏目专家坐堂 → 如何遍历日志表,生成josn文件内容呢?


  共有3661人关注过本帖树形打印复制链接

主题:如何遍历日志表,生成josn文件内容呢?

帅哥哟,离线,有人找我吗?
李孝春
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
如何遍历日志表,生成josn文件内容呢?  发帖心情 Post By:2020/7/20 16:07:00 [显示全部帖子]

现有一表“日志”有如下字段和内容

图片点击可在新窗口打开查看此主题相关图片如下:1122.png
图片点击可在新窗口打开查看


Dim jo As New JObject
Dim ja As New JArray
jo("danweiname") = "AAA"
jo("name") = "BB"
jo("date") =  ja '
ja.Add(New JObject) '给数组添加两个对象成员
ja.Add(New JObject) 
ja(0)("time") = "2020-12-11"
ja(0)("context") = "下午"
ja(1)("time") = "2020-12-12"
ja(1)("context") = "中午"
Output.Show(jo.ToString)

上述代码可以固定生成
{
  "danweiname": "AAA",
  "name": "BB",
  "date": [
    {
      "time": "2020-12-11",
      "context": "下午"
    },
    {
      "time": "2020-12-12",
      "context": "中午"
    }
  ]
}


随着日志表记录越来越多  这个相对固定生成josn的形式就不大方便了

有没有办法实现如下功能呢?
1、根据日志表中的danweiname  name  time三个字段作为条件  分类生成context内容
2、先判断danweiname 如上josn结果 先显示单位名称  (若遇多个单位:需要先一个单位显示完毕了才生成下一个单位的)
3、判断name,如上josn结果  根据单位名称 显示name  (若遇一个单位,日志记录里有多个name值相同的,先显示完毕了才显示下一个name的相关内容)
4、判断time且满足danweiname name的条件时,如上josn结果  根据time先后顺序进行数据生成 并显示context的对应值

 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点蓝)使用getvalues+select遍历即可'定义数...  发帖心情 Post By:2020/7/20 17:05:00 [显示全部帖子]

Dim Arys As List(Of String())
Arys = DataTables("josn").GetValues("danweiname|name") '列名用符号|分割
'注意循环变量是字符型数组,所以类型是String(),而不是String
For Each Ary As String() In Arys
    Output.Show(Ary(0) & "|" & Ary(1))
        Dim jo As New JObject
        Dim ja As New JArray
        jo("danweiname") = Ary(0)
        jo("name") =  Ary(1)
        jo("date") =  ja '
        ja.Add(New JObject) '给数组添加两个对象成员
        ja.Add(New JObject)
    For Each dr As DataRow In DataTables("josn").Select("danweiname= '" & Ary(0) & "' and name='" & Ary(1) & "'")
        Output.Show(dr("tiem"))
        Output.Show(dr("context"))
        ja(0)("tiem") = dr("tiem")
        ja(0)("context") = dr("context")
        ja(1)("tiem") = dr("tiem")
        ja(1)("context") = dr("context")
        Output.Show(jo.ToString)
    Next
Next

红色部分启用之后  会报错  不启用 则生成如下:
2012-12-12
下午
{
  "danweiname": "AAA",
  "name": "BB"
}
2020-11-11
中午
{
  "danweiname": "AAA",
  "name": "BB"
}
2020-11-11
WANSHANG
{
  "danweiname": "AAA",
  "name": "BB"
}
2012-11-12
CE
{
  "danweiname": "AAA",
  "name": "CC"
}
2012-11-13
ZHONGWU
{
  "danweiname": "BBB",
  "name": "QQ"
}

 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点蓝)Dim Arys As List(Of String())Arys ...  发帖心情 Post By:2020/7/20 17:35:00 [显示全部帖子]

再麻烦老师指导下  上述代码运行还是没有成功 提示如下:
jo("date").add(jo2)
这个提示没有ADD成员  我tab查看  精灵提示里面只有parse tostring两个 

 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
  发帖心情 Post By:2020/7/21 9:14:00 [显示全部帖子]

老师  还是有点小问题 没有能够成功生成想要的josn 麻烦老师指导下
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:josn测试.foxdb



代码内容
Dim Arys As List(Of String())
Arys = DataTables("josn").GetValues("danweiname|name") 
Dim jaaa As New JArray
Dim jo,jo2 As JObject
For Each Ary As String() In Arys
    Output.Show(Ary(0) & "|" & Ary(1))
    jo = New JObject
    jo("danweiname") = Ary(0)
    jo("name") =  Ary(1)
    Dim ja2 As New JArray'
    
    For Each dr As DataRow In DataTables("josn").Select("danweiname= '" & Ary(0) & "' and name='" & Ary(1) & "'")
        Output.Show(dr("tiem"))
        Output.Show(dr("context"))
        jo2 = New JObject
        jo2("tiem") = dr("tiem")
        jo2("context") = dr("context")
        ja2.add(jo2)
    Next
    jo("date") = ja2
    jaaa.Add(jo)
Next

运行提示:

图片点击可在新窗口打开查看此主题相关图片如下:11111.jpg
图片点击可在新窗口打开查看
[此贴子已经被作者于2020/7/21 9:17:15编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点蓝)jo2("tiem") = cstr(dr("tiem"))  发帖心情 Post By:2020/7/21 17:47:00 [显示全部帖子]

有点蓝老师  经过你的指导 现在代码如下:
Dim Arys As List(Of String())
Arys = DataTables("josn").GetValues("danweiname|name")
Dim jaaa As New JArray
Dim jo,jo2 As JObject
For Each Ary As String() In Arys
    'Output.Show(Ary(0) & "|" & Ary(1))
    jo = New JObject
    jo("danweiname") = Ary(0)
    jo("name") =  Ary(1)
    Dim ja2 As New JArray'
    For Each dr As DataRow In DataTables("josn").Select("danweiname= '" & Ary(0) & "' and name='" & Ary(1) & "'")
        'Output.Show(dr("tiem"))
        'Output.Show(dr("context"))
        jo2 = New JObject
        jo2("tiem") = cstr(dr("tiem"))
        jo2("context") = cstr(dr("context"))
        ja2.add(jo2)
    Next
    jo("date") = ja2
    jaaa.Add(jo)
Next
'Output.Show(jaaa.ToString)
Dim content As String
content &= jaaa.ToString
'Output.Show(content)
Dim lj As String = Date.Today & "save.json"
Dim FileName As String = ProjectPath & lj
FileSys.WriteAllText(FileName, content, True)

代码运行后得到的json达到预期,并且成功将json内容写入文件里
[
  {
    "danweiname": "AAAA",
    "name": "BB",
    "date": [
      {
        "tiem": "2020-09-01",
        "context": "CES"
      },
      {
        "tiem": "2020-11-11",
        "context": "REW"
      },
      {
        "tiem": "2020-12-12",
        "context": "TRE"
      }
    ]
  },
  {
    "danweiname": "AAAA",
    "name": "QQ",
    "date": [
      {
        "tiem": "2019-12-12",
        "context": "UY"
      },
      {
        "tiem": "2020-11-21",
        "context": "IUYIU"
      }
    ]
  },
  {
    "danweiname": "BBBB",
    "name": "CC",
    "date": [
      {
        "tiem": "2019-03-20",
        "context": "RTYE"
      },
      {
        "tiem": "2020-09-03",
        "context": "EWR"
      }
    ]
  },
  {
    "danweiname": "CCCC",
    "name": "WW",
    "date": [
      {
        "tiem": "2018-09-01",
        "context": "TREWR"
      },
      {
        "tiem": "2019-02-01",
        "context": "Q"
      }
    ]
  },
  {
    "danweiname": "DDDD",
    "name": "EE",
    "date": [
      {
        "tiem": "2020-07-21",
        "context": "432W"
      }
    ]
  }
]


参照帮助代码如下:
Dim json As String = jaaa.ToString
Dim jojo As JObject = JObject.Parse(json)
Output.Show("单位名称:" & jojo("danweiname"))
Output.Show("姓名:" & jojo("name"))
For Each ep As JToken In jojo("date")
    Output.Show( "日期:" & ep("tiem").ToString() &  "记录:" & ep("cotext").ToString()   )
Next
运行无法正常,提示报错,麻烦看看是不是我将json结构理解有误。
[此贴子已经被作者于2020/7/21 17:48:00编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点蓝)jo2("tiem") = cstr(dr("tiem"))  发帖心情 Post By:2020/7/21 18:00:00 [显示全部帖子]

有点蓝老师 参照你发布在论坛里的exweui我试一下将所生成的json文件解析成如下页面  没有成功  麻烦老师指导下  谢谢

图片点击可在新窗口打开查看此主题相关图片如下:11111.jpg
图片点击可在新窗口打开查看

以下内容是专门发给李孝春浏览



内部函数名json  
内容:
Dim e As RequestEventArgs = args(0)
Dim wb As New weui
wb.AppendHTML("<link rel='stylesheet' href='./weui/exweui.css'/>",True)
Dim fl As String = HttpServer.WebPath & "\save.json"
If FileSys.FileExists(fl)
    Dim txt As String = FileSys.ReadAllText(fl)
    Dim jo As JObject = Jobject.Parse(txt)
    'If jo("danweiname") IsNot Nothing Then
        With ExWeUI.WebUI.AddStepGroup("","step1","",,2)
            For Each jt As JToken In jo("date")
                With .AddStep("st01","",jt("tiem").ToString)
                    .Description = jt("context").ToString
                End With
            Next
            wb.InsertHTML(.BuildHtml)
        End With
    'End If
    e.WriteString(wb.Build)
Else
    e.WriteString("没有查到信息")
End If

运行后页面提示错误
.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2020.5.29.8
错误所在事件:自定义函数,json
详细错误信息:
调用的目标发生了异常。
Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path '', line 1, position 1.

 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点蓝)先搞清楚自己的json结构:http://www...  发帖心情 Post By:2020/7/22 10:18:00 [显示全部帖子]

从文本读取json内容后怎么解析呢?
Dim fl As String = HttpServer.WebPath & "\save.json"
If FileSys.FileExists(fl)
    Dim txt As String = FileSys.ReadAllText(fl)
    Dim ja As JArray = JArray.Parse(txt)
    For i As Integer = 0 To ja.Count - 1
        If ja("danweiname") IsNot Nothing Then
            output.show(ja(i)("danweiname"))
            Dim ja2 As JArray =ja(i)("date")
            For Each jt As JToken In ja2
                For j As Integer = 0 To ja2.Count - 1
                    output.show(ja2(j)("tiem").ToString)
                    output.show(ja2(j)("context").ToString)
                Next
            Next
        End If
    Next
End If
运行报错 如下:

图片点击可在新窗口打开查看此主题相关图片如下:2222222.png
图片点击可在新窗口打开查看



以下内容是专门发给有点蓝浏览


怎么实现如下效果呢

图片点击可在新窗口打开查看此主题相关图片如下:11111.jpg
图片点击可在新窗口打开查看


[此贴子已经被作者于2020/7/22 10:24:31编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点蓝)一个流程图只能显示一个流程,这个jo...  发帖心情 Post By:2020/7/22 10:29:00 [显示全部帖子]

那  老师  红色部分代码是否有办法实现根据daiweiname和name  进行批量生成各个不同内容的 json文件不呢?
Dim Arys As List(Of String())
Arys = DataTables("josn").GetValues("danweiname|name")
Dim jaaa As New JArray
Dim jo,jo2 As JObject
For Each Ary As String() In Arys
    jo = New JObject
    jo("danweiname") = Ary(0)
    jo("name") =  Ary(1)
    Dim ja2 As New JArray'
    For Each dr As DataRow In DataTables("josn").Select("danweiname= '" & Ary(0) & "' and name='" & Ary(1) & "'")
        jo2 = New JObject
        jo2("tiem") = cstr(dr("tiem"))
        jo2("context") = cstr(dr("context"))
        ja2.add(jo2)
    Next
    jo("date") = ja2
    jaaa.Add(jo)
Next
Dim content As String
content &= jaaa.ToString
Dim lj As String = Date.Today & "save.json"
Dim FileName As String = ProjectPath & lj
FileSys.WriteAllText(FileName, content, True)

 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点蓝)如果数据来源于表格,直接从表格取数...  发帖心情 Post By:2020/7/22 10:48:00 [显示全部帖子]

是想学习写法:
1、假定这个json就是从别处得到的 然后解析(老师已指导)
2、学习表格数据生成json(老师已指导) 怎么根据条件分别批量创建json(尚未学习到方法)
3、根据json然后按照老师的exweui来学习流程图设计(老师已指导)
4、怎么根据表格来直接生成流程图呢?(尚未学习到方法)

下面的参照流程图设计帮助
Dim e As RequestEventArgs = args(0)
Dim wb As New weui
wb.AppendHTML("<link rel='stylesheet' href='./exweui.css'/>",True)
Dim fl As String = HttpServer.WebPath & "\save.json"
If FileSys.FileExists(fl)
    Dim txt As String = FileSys.ReadAllText(fl)
    Dim jo As JObject = Jobject.Parse(txt)
    If jo("danweiname") IsNot Nothing Then
        With ExWeUI.WebUI.AddStepGroup("","step1","",,2)
            With .AddStep("st02","","【单位名称】" & jo("danweiname").ToString)
                .Description = "【人员名称】" & jo("name").ToString
            End With
            For Each jt As JToken In jo("date")
                With .AddStep("st01","","【日期】" & jt("tiem").ToString)
                    .Description = "【摘要】" & jt("context").ToString
                End With
            Next
            wb.InsertHTML(.BuildHtml)
        End With
    End If
    e.WriteString(wb.Build)
Else
    e.WriteString("没有查到快递信息")
End If
json文件内容:
{
    "danweiname": "AAAA",
    "name": "BB",
    "date": [
      {
        "tiem": "2020-09-01",
        "context": "CES"
      },
      {
        "tiem": "2020-11-11",
        "context": "REW"
      },
      {
        "tiem": "2020-12-12",
        "context": "TRE"
      }
    ]
  }
  
得到如下图:

图片点击可在新窗口打开查看此主题相关图片如下:11111.jpg
图片点击可在新窗口打开查看
有没有办法  取消单位名称和人员名称左边的那点和线条呢

[此贴子已经被作者于2020/7/22 10:50:36编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点蓝)根据表格来直接生成流程图自己看懂16...  发帖心情 Post By:2020/7/22 11:11:00 [显示全部帖子]

OK  谢谢老师指导  灰常感谢!

 回到顶部
总数 11 1 2 下一页