首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更轻松地动态创建JSON?

如何更轻松地动态创建JSON?
EN

Stack Overflow用户
提问于 2018-11-30 21:25:45
回答 1查看 561关注 0票数 1

我正在使用JsonTextWriter构造一个JSON字符串,最终结果需要如下所示。数据属性值"John“将被一个字符串变量替换,以便在REST调用中搜索不同的名称:

代码语言:javascript
复制
{
  "fields": [
    "name",
    "Company.name",
    "email",
    "mobile"
  ],
  "query": {
    "group": {
      "operator": "AND",
      "rules": [
        {
          "condition": "CONTAINS",
          "moduleName": "Contact",
          "field": {
            "fieldName": "name"
          },
          "data": "John Doe"
        }
      ]
    }
  }
}

这个JsonTextWriter方法对我来说很难读,不直观。我猜想有一种方法可以代替创建一个包含所有属性和赋值的类?但我不知道怎么处理嵌套的东西。也许对某些部分使用原始JSON来使代码结构更容易表示最终的JSON更好呢?这是我现在的代码,它工作,它只是笨重的阅读/编辑。我正在考虑类似LINQ的内容,当您查看LINQ代码时,很容易“看到”XML结构:

代码语言:javascript
复制
Dim sb As StringBuilder = New StringBuilder()
Dim jw As JsonWriter = New JsonTextWriter(New StringWriter(sb))
jw.Formatting = Formatting.Indented
jw.WriteStartObject()

jw.WritePropertyName("fields")
jw.WriteStartArray()
jw.WriteValue("name")
jw.WriteValue("Company.name")
jw.WriteValue("email")
jw.WriteValue("mobile")
jw.WriteEndArray()

jw.WritePropertyName("query")
jw.WriteStartObject()
jw.WritePropertyName("group")
jw.WriteStartObject()
jw.WritePropertyName("operator")
jw.WriteValue("AND")
jw.WritePropertyName("rules")
jw.WriteStartArray()
jw.WriteStartObject()
jw.WritePropertyName("condition")
jw.WriteValue("CONTAINS")
jw.WritePropertyName("moduleName")
jw.WriteValue("Contact")
jw.WritePropertyName("field")
jw.WriteStartObject()
jw.WritePropertyName("fieldName")
jw.WriteValue("name")
jw.WriteEndObject()
jw.WritePropertyName("data")
jw.WriteValue("John Doe")
jw.WriteEndObject()
jw.WriteEndArray()
jw.WriteEndObject()
jw.WriteEndObject()
jw.WriteEndObject()

debug.writeline(sb.ToString)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-30 22:06:11

可以使用匿名对象定义与JSON层次结构相对应的层次结构,然后序列化:

代码语言:javascript
复制
Dim data As String = "John Doe"

Dim example = New With { _ 
    .fields = {"name","Company.name","email","mobile"}, _
    .query = New With { _
        .group = New With { _
            .[operator] = "AND", _
            .rules = { _
                New With { _
                    .condition = "CONTAINS", _
                    .moduleName = "Contact", _
                    .field = new With { .fieldName = "name" }, _
                    .data = data _
                } _
            } _
        } _
    } _                 
}

Dim json as String = JsonConvert.SerializeObject(example, Formatting.Indented)

样品小提琴#1 这里

如果希望使用显式命名类型,可以使用代码生成工具(如https://jsonutils.com/将JSON粘贴为类 )生成与JSON对应的数据模型,如下所示:

代码语言:javascript
复制
Public Class Field
    Public Property fieldName As String
End Class

Public Class Rule
    Public Property condition As String
    Public Property moduleName As String
    Public Property field As Field
    Public Property data As String
End Class

Public Class Group
    ' Note I had to fix this by adding brackets around "operator", since it's a keyword.
    ' Public Property operator As String
    Public Property [operator] As String
    Public Property rules As Rule()
End Class

Public Class Query
    Public Property group As Group
End Class

Public Class Example
    Public Property fields As String()
    Public Property query As Query
End Class

然后使用相同的对象初始化器语法分配和序列化:

代码语言:javascript
复制
Dim data As String = "John Doe"

Dim example = New Example With { _ 
    .fields = {"name","Company.name","email","mobile"}, _
    .query = New Query With { _
        .group = New Group With { _
            .[operator] = "AND", _
            .rules = { _
                New Rule With { _
                    .condition = "CONTAINS", _
                    .moduleName = "Contact", _
                    .field = new Field With { .fieldName = "name" }, _
                    .data = data _
                } _
            } _
        } _
    } _                 
}

Dim json as String = JsonConvert.SerializeObject(example, Formatting.Indented)

备注:

  • Operator是一个vb.net关键字,所以我不得不在自动生成的operator属性周围添加括号。
  • 如果要构建更复杂的数据模型示例,则可能需要用List(Of T)属性替换自动生成的数组属性。 公共财产规则清单(规则)

样品小提琴#2 这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53565130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档