Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在vb.net中读取JSON字符串_Json_Vb.net_Reference_Json.net - Fatal编程技术网

在vb.net中读取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

我从下面的代码中得到结果文本中的JSON字符串

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"":
...