无法正确解析 JSON 正文

Unable to correctly parse JSON body

我使用 Newtonsoft 库在 Visual Studio 2019 年的 URL 中成功检索到了 JSON 正文。但是我很难解析出我感兴趣的唯一变量。

我已经尝试遵循此处的一些指南,但我似乎没有正确实施或没有完全理解(我对此很陌生)。 例如

RAW JSON:

{"deviceId":37,"longMacAddress":"5884e40000000439","shortMacAddress":259,"hoplist":"(259,3)","associationTime":"2019-06-10 22:43:54","lifeCheckInterval":5,"lastLiveCheck":"2019-06-11 07:11:37","onlineStatus":1,"txPowerValue":14,"deviceType":1,"frequencyBand":1,"lastLivecheck":"2019-06-11 07:11:36","disassociationState":0,"firmwareUpdateActivated":0,"firmwareUpdatePackagesSent":0,"firmwareUpdatePackagesUnsent":0,"firmwareUpdateInProgress":0,"deviceIdOem":"-1","deviceNameOem":"-1","deviceCompanyOem":"-1","binaryInputCount":0,"binaryOutputCount":0,"analogInputCount":0,"characterStringCount":1,"location":[{"location":"UK","locationWriteable":1,"changedAt":"2019-06-10 23:40:50"}],"description":[{"description":"DevKit","descriptionWriteable":1,"changedAt":"2019-06-10 23:40:54"}],"binaryInput":[],"binaryOutput":[],"analogInput":[],"characterString":[{"characterString":"149+0.0+99+26.5+0","characterStringWriteable":1,"changedAt":"2019-06-11 06:45:02"}]}

我的主要代码:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace API_JSON_1
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new WebClient();
            var JSON = client.DownloadString("http://192.168.0.254:8000/nodes/longmac/5884e40000000439");
            Console.WriteLine(JSON);
            Console.WriteLine("----------------------------------------------");
            CharacterString CSV = JsonConvert.DeserializeObject<CharacterString>(JSON);
            Console.WriteLine("Sensor data: " + CSV.CharacterStringCharacterString);
        }
    }
}

我的字符串CLASS:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace API_JSON_1
{
    public class CharacterStrings
    {
        public CharacterStrings CharString { get; set; }
    }

    public class CharacterString
    {   public string CharacterStringCharacterString { get; set; }
        public long CharacterStringWriteable { get; set; }
        public DateTimeOffset ChangedAt { get; set; }
    }
}

输出到控制台:

{"deviceId":37,"longMacAddress":"5884e40000000439","shortMacAddress":259,"hoplis
t":"(259,3)","associationTime":"2019-06-10 22:43:54","lifeCheckInterval":5,"last
LiveCheck":"2019-06-11 06:56:37","onlineStatus":1,"txPowerValue":14,"deviceType"
:1,"frequencyBand":1,"lastLivecheck":"2019-06-11 06:56:33","disassociationState"
:0,"firmwareUpdateActivated":0,"firmwareUpdatePackagesSent":0,"firmwareUpdatePac
kagesUnsent":0,"firmwareUpdateInProgress":0,"deviceIdOem":"-1","deviceNameOem":"
-1","deviceCompanyOem":"-1","binaryInputCount":0,"binaryOutputCount":0,"analogIn
putCount":0,"characterStringCount":1,"location":[{"location":"UK","locati
onWriteable":1,"changedAt":"2019-06-10 23:40:50"}],"description":[{"description"
:"DevKit","descriptionWriteable":1,"changedAt":"2019-06-10 23:40:54"}],"binaryIn
put":[],"binaryOutput":[],"analogInput":[],"characterString":[{"characterString"
:"149+0.0+99+26.5+0","characterStringWriteable":1,"changedAt":"2019-06-11 06:45:
02"}]}
----------------------------------------------
Sensor data:
Press any key to continue . . .

显然我 expecting/hoping 认为倒数第二行应该是: "Sensor data: 149+0.0+99+26.5+0"

json中的CharacterString属性是一个对象数组。此外,这些对象中的第一个 属性 是 characterString。下面是一个工作示例

输出为Sensor Data: 149+0.0+99+26.5+0

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;

namespace SOTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var json =
                "{\"deviceId\":37,\"longMacAddress\":\"5884e40000000439\",\"shortMacAddress\":259,\"hoplist\":\"(259,3)\",\"associationTime\":\"2019-06-10 22:43:54\",\"lifeCheckInterval\":5,\"lastLiveCheck\":\"2019-06-11 07:11:37\",\"onlineStatus\":1,\"txPowerValue\":14,\"deviceType\":1,\"frequencyBand\":1,\"lastLivecheck\":\"2019-06-11 07:11:36\",\"disassociationState\":0,\"firmwareUpdateActivated\":0,\"firmwareUpdatePackagesSent\":0,\"firmwareUpdatePackagesUnsent\":0,\"firmwareUpdateInProgress\":0,\"deviceIdOem\":\"-1\",\"deviceNameOem\":\"-1\",\"deviceCompanyOem\":\"-1\",\"binaryInputCount\":0,\"binaryOutputCount\":0,\"analogInputCount\":0,\"characterStringCount\":1,\"location\":[{\"location\":\"UK\",\"locationWriteable\":1,\"changedAt\":\"2019-06-10 23:40:50\"}],\"description\":[{\"description\":\"DevKit\",\"descriptionWriteable\":1,\"changedAt\":\"2019-06-10 23:40:54\"}],\"binaryInput\":[],\"binaryOutput\":[],\"analogInput\":[],\"characterString\":[{\"characterString\":\"149+0.0+99+26.5+0\",\"characterStringWriteable\":1,\"changedAt\":\"2019-06-11 06:45:02\"}]}";

            var obj = JsonConvert.DeserializeObject<CharacterStrings>(json);
            Console.WriteLine($"Sensor Data: {obj.CharacterString.First().CharacterString}");
            Console.ReadKey();
        }

        public class CharacterStrings
        {
            public List<Characters> CharacterString { get; set; }
        }

        public class Characters
        {   public string CharacterString { get; set; }
            public long CharacterStringWriteable { get; set; }
            public DateTime ChangedAt { get; set; }
        }
    }
}

您正在使用 CharacterSting 定义 CSV 对象。我应该是 CharacterStrings 并且在 CharacterStrings 里面 class 它应该是数组因为你的 JSON 是一个数组

欢迎使用 Whosebug!

将 json 字符串转换为对象(即:反序列化)时需要记住的一点是,将字符串转换成的对象需要与 json 字符串。在您的情况下,json 字符串与您要转换到的对象不匹配。

一旦您拥有正确的对象,这将为您提供所需的输出:

    static void Main(string[] args)
    {
        string JSON = "{\"deviceId\":37,\"longMacAddress\":\"5884e40000000439\",\"shortMacAddress\":259,\"hoplist\":\"(259,3)\",\"associationTime\":\"2019-06-10 22:43:54\",\"lifeCheckInterval\":5,\"lastLiveCheck\":\"2019-06-11 07:11:37\",\"onlineStatus\":1,\"txPowerValue\":14,\"deviceType\":1,\"frequencyBand\":1,\"lastLivecheck\":\"2019-06-11 07:11:36\",\"disassociationState\":0,\"firmwareUpdateActivated\":0,\"firmwareUpdatePackagesSent\":0,\"firmwareUpdatePackagesUnsent\":0,\"firmwareUpdateInProgress\":0,\"deviceIdOem\":\"-1\",\"deviceNameOem\":\"-1\",\"deviceCompanyOem\":\"-1\",\"binaryInputCount\":0,\"binaryOutputCount\":0,\"analogInputCount\":0,\"characterStringCount\":1,\"location\":[{\"location\":\"UK\",\"locationWriteable\":1,\"changedAt\":\"2019-06-10 23:40:50\"}],\"description\":[{\"description\":\"DevKit\",\"descriptionWriteable\":1,\"changedAt\":\"2019-06-10 23:40:54\"}],\"binaryInput\":[],\"binaryOutput\":[],\"analogInput\":[],\"characterString\":[{\"characterString\":\"149+0.0+99+26.5+0\",\"characterStringWriteable\":1,\"changedAt\":\"2019-06-11 06:45:02\"}]}";
        Console.WriteLine(JSON);
        Console.WriteLine("----------------------------------------------");
        RootObject CSV = JsonConvert.DeserializeObject<RootObject>(JSON);

        // Option 1: Loop over the items in your List<CharacterString>...

        foreach (var cs in CSV.characterString)
        {
            Console.WriteLine("Sensor data: " + cs.characterString);
        }

        // Option 2: Or, if you know there is only one in the list...

        Console.WriteLine("Sensor data: " + CSV.characterString.First().characterString);
   }

编辑以解释上面的代码: 因为 characterString 是一个 List<CharacterString>,从技术上讲,您可以在该列表中拥有多个项目.选项 1:如果需要,您可以遍历该列表以显示其中的项目。但是,如果您确定列表中只会有一个项目,那么,选项 2:您可以只在列表中显示 .First() 项目。

我接受了你给我们的 json 刺痛,并使用这个方便的网站 (http://json2csharp.com/#) 将其转换为以下内容 类:

public class RootObject
{
    public int deviceId { get; set; }
    public string longMacAddress { get; set; }
    public int shortMacAddress { get; set; }
    public string hoplist { get; set; }
    public string associationTime { get; set; }
    public int lifeCheckInterval { get; set; }
    public string lastLiveCheck { get; set; }
    public int onlineStatus { get; set; }
    public int txPowerValue { get; set; }
    public int deviceType { get; set; }
    public int frequencyBand { get; set; }
    public string lastLivecheck { get; set; }
    public int disassociationState { get; set; }
    public int firmwareUpdateActivated { get; set; }
    public int firmwareUpdatePackagesSent { get; set; }
    public int firmwareUpdatePackagesUnsent { get; set; }
    public int firmwareUpdateInProgress { get; set; }
    public string deviceIdOem { get; set; }
    public string deviceNameOem { get; set; }
    public string deviceCompanyOem { get; set; }
    public int binaryInputCount { get; set; }
    public int binaryOutputCount { get; set; }
    public int analogInputCount { get; set; }
    public int characterStringCount { get; set; }
    public List<Location> location { get; set; }
    public List<Description> description { get; set; }
    public List<object> binaryInput { get; set; }
    public List<object> binaryOutput { get; set; }
    public List<object> analogInput { get; set; }
    public List<CharacterString> characterString { get; set; }
}

public class Location
{
    public string location { get; set; }
    public int locationWriteable { get; set; }
    public string changedAt { get; set; }
}

public class Description
{
    public string description { get; set; }
    public int descriptionWriteable { get; set; }
    public string changedAt { get; set; }
}

public class CharacterString
{
    public string characterString { get; set; }
    public int characterStringWriteable { get; set; }
    public string changedAt { get; set; }
}

为了使其正常工作,您必须像这样修改 类:

public class CharacterStrings
{
    public List<CharacterStringObject> CharacterString { get; set; }
}
public class CharacterStringObject
{
    public string CharacterString { get; set; }
    public long CharacterStringWriteable { get; set; }
    public DateTime ChangedAt { get; set; }
}

在那之后,当你像那样阅读你的 JSON 之后:

CharacterString CSV = JsonConvert.DeserializeObject<CharacterString>(JSON);

你最终得到 List<CharacterStringObject> 其中有一个元素。所以你把第一个像这样打印出来:

Console.WriteLine("Sensor data: " + CSV.CharacterString.First().CharacterString);

干杯,
编辑:使用您给定的 JSON 在本地进行测试,工作正常