【问题标题】:How to design an object model to generate a specific JSON string when serialized?序列化时如何设计对象模型生成特定的 JSON 字符串?
【发布时间】:2018-01-01 20:15:51
【问题描述】:

我需要将此 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

更新: 当我想要一个以上的测量值时,我必须做什么? 像这样:

{
  "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
        ]
      }
    }
  ]
}

【问题讨论】:

  • JSONHandling 类中使用测量集合。 Public Property measurements As List(Of JSONHandlingMeasurements)

标签: json vb.net json.net


【解决方案1】:

以下类型可用于生成您需要的 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

你可以如下初始化它们:

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

注意事项:

  • "measurements" 属性的值是一个JSON 数组 -- 一个有序集合,它以[(左括号)开头,以](右括号),其值由,(逗号)分隔。正如Json.NET docs 中所解释的,数组必须从.Net 集合中序列化,例如List(Of T)T() 数组或为项目类型T 实现IEnumerable(Of T) 的其他类型。因此,例如您的 measurements 属性需要成为 List(Of JSONHandlingMeasurement)

  • 您有多个名称为无效 VB.NET 标识符的 JSON 属性("$_time""content-spec")。在这种情况下,您可以将&lt;JsonProperty("Desired Name")&gt; 属性添加到成员以覆盖序列化为 JSON 时使用的名称。

  • 我正在使用object initializercollection initializer 语法初始化makeJSON

样本工作.Net fiddle

【讨论】:

  • 一个简短的问题。当我想对 BasX 进行第二次测量时,我必须做什么?
  • @SteffenRössler - 我需要查看 minimal reproducible example - 即您希望反序列化的 JSON - 来提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多