在vb.net中读取JSON字符串
我从下面的代码中得到结果文本中的JSON字符串在vb.net中读取JSON字符串,json,vb.net,reference,json.net,Json,Vb.net,Reference,Json.net,我从下面的代码中得到结果文本中的JSON字符串 resp = webRequest.GetResponse Dim status = resp.StatusCode If (status = 200) Then respStream = New StreamReader(resp.GetResponseStream(), encoding) resultText = respStream.ReadToEnd() respStream.Dispose() 结果文本为 "{""sear
resp = webRequest.GetResponse
Dim status = resp.StatusCode
If (status = 200) Then
respStream = New StreamReader(resp.GetResponseStream(), encoding)
resultText = respStream.ReadToEnd()
respStream.Dispose()
结果文本为
"{""searchResult"":[{""id"":""2430.6086.3435.4713"",""name"":""0000425"",""type"":""Reference"",""revision"":""B.1"",""attribute[Entity.Name]"":""TestPart2"",""current"":""IN_WORK"",""attribute[Entity.ExternalID]"":""0000425""},{""id"":""24360.60586.12065.45796"",""name"":""0000417"",""type"":""Reference"",""revision"":""B.1"",""attribute[Entity.Name]"":""TestPart3"",""current"":""IN_WORK"",""attribute[Entity.ExternalID]"":""0000417""}],""msg"":""OK""}"
我需要为这个字符串中的每个对象创建一个数组列表(上面的结果在列表中有2个数组。每个数组都有值。)
因为我对JSON非常陌生。我对此一无所知。
我在vb.net中找到了Newton.Json库。如何使用此库处理JSON?简单的方法是转到并将JSON粘贴到其中(您必须使用记事本find/replace将双引号转换为单引号,并删除前导引号和尾随引号;您的JSON目前似乎是双引号)
QuickType将生成一组表示JSON的C#和一些用于序列化和反序列化的帮助器方法
然后使用其他服务将C#转换为VB.NET,这两种语言在下面编译成相同的东西,因此有很多转换器。Telerik的一个在我尝试时不起作用,codefusion的也不起作用,但产生了这个,看起来相当理智:
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Converters
Imports System.Runtime.CompilerServices
Namespace QuickType
Public Partial Class A
<JsonProperty("searchResult")>
Public Property SearchResult As SearchResult()
<JsonProperty("msg")>
Public Property Msg As String
End Class
Public Partial Class SearchResult
<JsonProperty("id")>
Public Property Id As String
<JsonProperty("name")>
Public Property Name As String
<JsonProperty("type")>
Public Property Type As String
<JsonProperty("revision")>
Public Property Revision As String
<JsonProperty("attribute[Entity.Name]")>
Public Property AttributeEntityName As String
<JsonProperty("current")>
Public Property Current As String
<JsonProperty("attribute[Entity.ExternalID]")>
Public Property AttributeEntityExternalId As String
End Class
Public Partial Class A
Public Shared Function FromJson(ByVal json As String) As A
Return JsonConvert.DeserializeObject(Of A)(json, Settings)
End Function
End Class
Public Module Serialize
<Extension()>
Public Function ToJson(ByVal self As A) As String
Return JsonConvert.SerializeObject(self, Settings)
End Function
End Module
Friend Module Converter
Public ReadOnly Settings As JsonSerializerSettings = New JsonSerializerSettings With {
.MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
.DateParseHandling = DateParseHandling.None
}
End Module
End Namespace
唯一需要弄清楚的事情是如何处理发送给您的损坏JSON的远程服务;它是JSON,但随后被编码为JSON,因此它本质上是一个包含JSON的字符串,而它应该是JSON,如下所示:
{
"searchResult": [
{
"id": "2430.6086.3435.4713",
"name": "0000425",
"type": "Reference",
"revision": "B.1",
"attribute[Entity.Name]": "TestPart2",
"current": "IN_WORK",
"attribute[Entity.ExternalID]": "0000425"
},
{
"id": "24360.60586.12065.45796",
"name": "0000417",
"type": "Reference",
"revision": "B.1",
"attribute[Entity.Name]": "TestPart3",
"current": "IN_WORK",
"attribute[Entity.ExternalID]": "0000417"
}
],
"msg": "OK"
}
这是因为编写web服务的人决定将某个对象序列化为字符串并返回字符串,然后web服务器再次对该字符串进行编码。应该做的只是返回对象。也就是说,web服务应该如下所示:
'controller function
Function GetWhatever() Returns ActionResult
Dim x as New Whatever
x.Id = "24360.60586.12065.45796"
x.Name = "0000417"
x.Type = type": "Reference"
Dim s as String = JsonEncodeMethod(x)
return Json(s)
EndFunction
当它看起来应该是:
'controller function
Function GetWhatever() Returns ActionResult
Dim x as New Whatever
x.Id = "24360.60586.12065.45796"
x.Name = "0000417"
x.Type = type": "Reference"
return Json(x)
EndFunction
最后一点要注意的是(我知道,我现在要讲一点)。通过使用调试器提取resultText
的值,确保您没有在这里大费周章-在他的屏幕截图和文本中,您可以看到工具提示和SO问题包含相同的字符串,但问题是visual studio调试器中的工具提示文本添加了另一级别的字符串编码
因此,根据您如何将resultText
粘贴到此处,大多数“它已被双重编码”的建议可能不是这样,因为resultText包含:
{
"searchResult": [
{
"id":
...
但您将其从visual studio中复制出来,导致它变成:
"{
""searchResult"": [
{
""id"":
...
如果有疑问,Console.WriteLine()
pps<代码>属性[Entity.Name]和
属性[Entity.ExternalID]
看起来不可靠。不太清楚为什么编写服务的人没有将其JSON标记为,“entity”:{“name”:“testPart3”,“externalID”:“0000417”},
。我也会解决这个问题如果您喜欢使用XML而不是对象集合,我这里有一个开源JSON到XDocument解析器:
"{
""searchResult"": [
{
""id"":
...