如何设计对象模型以在序列化时生成特定的JSON字符串?

如何设计对象模型以在序列化时生成特定的JSON字符串?,json,vb.net,json.net,Json,Vb.net,Json.net,我需要将此JSON字符串发布到服务器: { "content-spec":"urn:spec://bosch.com/cindy/measurement-message#v2", "device":{ "deviceID":"1de09010-ec04-11e7-bd8a-525400ed1935" }, "measurements":[ { "ts":"2017-07-25T15:40:00.000+02:00",

我需要将此JSON字符串发布到服务器:

{
   "content-spec":"urn:spec://bosch.com/cindy/measurement-message#v2",
   "device":{
      "deviceID":"1de09010-ec04-11e7-bd8a-525400ed1935"

   },
   "measurements":[
      {
         "ts":"2017-07-25T15:40:00.000+02:00",
         "series":{
            "$_time":[
               0
            ],
            "BasY":[
               1.5
            ]
         }
      }
   ]
}
目前我有以下结果:

 {
  "contentSpec": "urn:spec://bosch.com/cindy/measurement-message#v2",
  "device": {
    "deviceID": "1de09010-ec04-11e7-bd8a-525400ed1935"
  },
  "measurements": {
    "ts": "2018-01-01T21:11:42.0519229+01:00",
    "series": {
      "$_time": 10212,
      "value": 1.4
    }
  }
}
请注意,几个应该是数组(在JSON中用[]标记)的属性是简单对象。如何使这些成为阵列

这是我的代码:

Public Function createJSONString(jContent As Dictionary(Of String, String)) As String

    Dim tmpDate As DateTime = New DateTime(Now.Ticks, DateTimeKind.Utc.Local)
    Dim timestamp As String = tmpDate.ToString("o") '2009-06-15T13:45:30.0000000Z
    Dim makeJSON As JSONHandling = New JSONHandling

    makeJSON.contentSpec = "urn:spec://bosch.com/cindy/measurement-message#v2"
    makeJSON.device.deviceID = jContent("deviceID")
    makeJSON.measurements.ts = timestamp
    makeJSON.measurements.series.mtime = "10212"
    makeJSON.measurements.series.value = 1.4


    Return JsonConvert.SerializeObject(makeJSON).Replace("mtime", "$_time")
    '"{""content-spec"":""urn:spec://bosch.com/cindy/measurement-message#v2"", ""device"":{ ""deviceID"":""" & jContent.Item(0) & """ }, ""measurements"":[{""ts"":""" & timestamp & """, ""series"":{""$_time"":[0], ""PickY"":[" & jContent.Item(3) & "]}}]}"

End Function
我的模型如下:

Public Class JSONHandling
    Public contentSpec As String
    Public device As JSONHandlingDevice = New JSONHandlingDevice
    Public measurements As JSONHandlingMeasurements = New JSONHandlingMeasurements
End Class

Public Class JSONHandlingMeasurements
    Public ts As String
    Public series As JSONHandlingSeries = New JSONHandlingSeries
End Class

Public Class JSONHandlingSeries
    Public mtime As Integer
    Public value As Double
End Class
Public Function createJSONString(jContent As Dictionary(Of String, String)) As String

    Dim timestamp As String = "2017-07-25T15:40:00.000+02:00"

    Dim makeJSON As JSONHandling = New JSONHandling With
    {
        .contentSpec = "urn:spec://bosch.com/cindy/measurement-message#v2",
        .device = new JSONHandlingDevice With { .deviceID = jContent("deviceID") },
        .measurements = New List(Of JSONHandlingMeasurement)() From 
        {
            new JSONHandlingMeasurement With
            {
                .ts = timestamp,
                .series = new JSONHandlingSeries() With
                {
                    .BasY = new List(Of Double)() From { 1.5 },
                    .TimeList = new List(Of Integer)() From { 0 }
                }
            }
        }
    }

    Return JsonConvert.SerializeObject(makeJSON, Newtonsoft.Json.Formatting.Indented)
End Function
更新: 当我想要一个以上的测量值时,我必须做什么? 例如:

{
  "content-spec": "urn:spec://bosch.com/cindy/measurement-message#v2",
  "device": {
    "deviceID": "1de09010-ec04-11e7-bd8a-525400ed1935"
  },
  "measurements": [
    {
      "ts": "2018-01-01T21:24:46.8354066+01:00",
      "series": {
        "$_time": [
          0
        ],
        "PickY": [
          37.4
        ]
      }
    },
    {
      "ts": "2018-01-01T21:24:46.8354066+01:00",
      "series": {
        "$_time": [
          0
        ],
        "PickZ": [
          92
        ]
      }
    },
    {
      "ts": "2018-01-01T21:24:46.8354066+01:00",
      "series": {
        "$_time": [
          0
        ],
        "PickC": [
          0
        ]
      }
    }
  ]
}

以下类型可用于生成所需的JSON:

Public Class JSONHandling
    <JsonProperty("content-spec")> _
    Public Property contentSpec As String
    Public Property device As JSONHandlingDevice = New JSONHandlingDevice
    Public Property measurements As List(Of JSONHandlingMeasurement) = New List(Of JSONHandlingMeasurement)()
End Class

Public Class JSONHandlingMeasurement
    Public Property ts As String
    Public Property series As JSONHandlingSeries = new JSONHandlingSeries()
End Class

Public Class JSONHandlingDevice
    Public Property deviceID As String
End Class

Public Class JSONHandlingSeries
    <JsonProperty("$_time")> _
    Public Property TimeList As List(Of Integer) = new List(Of Integer)()

    Public Property BasY As List(Of Double) = new List(Of Double)()
End Class
注:

  • “measurements”
    属性的值是一个数组——一个有序的集合,以
    [
    (左括号)开始,以
    ]
    (右括号)结束,其值由
    (逗号)分隔。如中所述,数组必须从.Net集合中序列化,如
    列表(T)
    T()
    数组,或为项类型
    T
    实现
    IEnumerable(T)
    。因此,例如,您的
    度量值
    属性需要成为
    列表(JSONHandlingMeasurement)

  • 您有多个JSON属性(
    “$\u time”
    “content spec”
    )的名称是无效的VB.NET标识符。在这种情况下,您可以向成员添加属性,以覆盖序列化为JSON时使用的名称

  • 我正在使用和语法初始化
    makeJSON


样本加工。

使用
JSONHandling
类中的测量数据采集<代码>公共财产测量作为列表(JSONHandlingMeasurements)一个简短的问题。当我想对BasX进行第二次测量时,我必须做什么?@SteffenRössler-我需要看到一个——即您希望反序列化的JSON——来帮助。