无法正确解析JSON正文

时间:2019-08-27 14:58:20

标签: c# json visual-studio-2019

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

我在这里尝试遵循一些指南,这些指南似乎没有正确实施或没有完全理解(我对此很陌生)。 例如 Unexpected character encountered while parsing API response

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);
        }
    }
}

我的角色字符串班级:

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

很明显,我期望/希望倒数第二行显示为: “传感器数据:149 + 0.0 + 99 + 26.5 + 0”

4 个答案:

答案 0 :(得分: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; }
        }
    }
}

答案 1 :(得分:0)

您正在使用CharacterSting定义CSV对象。我应该是CharacterStrings,而在CharacterStrings类中,它应该是数组,因为您的JSON是数组

答案 2 :(得分:0)

欢迎使用StackOverflow!

将json字符串转换为对象时(例如:反序列化),您需要记住的一点是,要将字符串转换为的对象需要与json字符串的格式匹配。就您而言,json字符串与您要转换的对象不匹配。

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

@CrossOrigin("*")
@PostMapping("/login")
public userLogin(@RequestedBody modalName objectname){
//Service Call
} 

编辑以解释上面的代码:由于 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,因此从技术上讲,该列表中可能有多个项目。选项1:如果需要,您可以遍历该列表以显示其中的项目。但是,如果可以肯定地知道列表中只有一项,那么方法2:您只需在列表中显示.First()项即可。

我拿了您给我们的json字符串,然后使用这个方便的网站(http://json2csharp.com/#)将其转换为以下类:

List<CharacterString>

答案 3 :(得分:0)

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

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);

enter image description here

最后得到List<CharacterStringObject>,其中包含一个元素。因此,您可以像这样打印第一个:

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

干杯,
编辑:使用给定的JSON在本地进行测试,效果很好