我正在使用JsonTextWriter构造一个JSON字符串,最终结果需要如下所示。数据属性值"John“将被一个字符串变量替换,以便在REST调用中搜索不同的名称:
{
"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结构:
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)发布于 2018-11-30 22:06:11
可以使用匿名对象定义与JSON层次结构相对应的层次结构,然后序列化:
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对应的数据模型,如下所示:
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然后使用相同的对象初始化器语法分配和序列化:
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 这里。
https://stackoverflow.com/questions/53565130
复制相似问题