【发布时间】:2018-12-13 01:22:50
【问题描述】:
我完全是 C# 初学者。我正在尝试在 c# 中转换 json 数据。我在清单上苦苦挣扎。只要我能够转换基本方法,列表中就有一个错误。你介意给我一些建议如何解决我的问题吗?
原始 JSON 数据
[{“数据”:{“温度”:{“数据”:{“2018-07-04 13:05:00”:20.9224991798401},“元”:{“单位”:“摄氏度”,“名称”:“温度”,“主题”:“天气”}}},“最新”:“2018-07-04 13:05:00”,“传感器高度”:-999,“类型”:“天气”, “base_height”:-999,“geom”:{“坐标”:[-1.62469, 54.98274],“type”:“Point”},“active”:“True”,“name”:“sportshall_oat”,“source ": {"document": null, "fancy_name": "BMS", "db_name": "Bms", "third_party": false, "web_display_name": "BMS"}}]
主类
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
var client = new WebClient();
var text = client.DownloadString("http://uoweb1.ncl.ac.uk/api/v1/sensor/live.json?sensor_name=sportshall_oat&api_key=4dopcdjiu3wtzfl32hn94hbf5ubm3q89jbh18iaxaqdzc10nlgbebqqvxqyt3ymydi59fjnyrmuqtgtdxb1sm5msac");
Rootobject ro = JsonConvert.DeserializeObject<Rootobject>(text);
Console.WriteLine("current time = " + ro.Property1);
Class1 c1 = JsonConvert.DeserializeObject<Class1>(text);
Data data = JsonConvert.DeserializeObject<Data>(text);
Temperature temperature = JsonConvert.DeserializeObject<Temperature>(text);
Console.WriteLine("data = " + temperature.data);
Data1 d1 = JsonConvert.DeserializeObject<Data1>(text);
Meta meta = JsonConvert.DeserializeObject<Meta>(text);
Geom geom = JsonConvert.DeserializeObject<Geom>(text);
Source source = JsonConvert.DeserializeObject<Source>(text);
}
}
}
JSON 数据(由 Visual Studio 生成)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
public class Rootobject
{
public Class1[] Property1 { get; set; }
}
public class Class1
{
public Data data { get; set; }
public string latest { get; set; }
public int sensor_height { get; set; }
public string type { get; set; }
public int base_height { get; set; }
public Geom geom { get; set; }
public string active { get; set; }
public string name { get; set; }
public Source source { get; set; }
}
public class Data
{
public Temperature Temperature { get; set; }
}
public class Temperature
{
public Data1 data { get; set; }
public Meta meta { get; set; }
}
public class Data1
{
public float _20180704130500 { get; set; }
}
public class Meta
{
public string units { get; set; }
public string name { get; set; }
public string theme { get; set; }
}
public class Geom
{
public float[] coordinates { get; set; }
public string type { get; set; }
}
public class Source
{
public object document { get; set; }
public string fancy_name { get; set; }
public string db_name { get; set; }
public bool third_party { get; set; }
public string web_display_name { get; set; }
}
}
当我试图运行我的程序时,控制台被粉碎了。调试后我可以知道问题出在哪里,但我不知道如何解决它。有错误提示
Newtonsoft.Json.JsonSerializationException: '无法反序列化 当前 JSON 数组(例如 [1,2,3])转换为“ConsoleApp2.Rootobject”类型 因为该类型需要一个 JSON 对象(例如 {"name":"value"}) 正确反序列化。
要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"}) 或将反序列化类型更改为数组或 实现集合接口的类型(例如 ICollection、IList) 比如可以从 JSON 数组反序列化的 List。 JsonArrayAttribute 也可以添加到类型中以强制它 从 JSON 数组反序列化。
提前谢谢大家。
【问题讨论】:
-
JSON 周围的方括号
[]表示它是一个数组。在这种情况下,反序列化为List<RootObject>是最常见的解决方案,所以var ro = JsonConvert.DeserializeObject<List<Rootobject>>(text); -
@Equalsk 更像
List<Class1>但是是的,基本正确:) -
在反序列化 JSON 之后,一旦您不需要进行任何进一步的反序列化,您就可以简单地访问初始类中的所有内容。
-
@DavidG 只是检查其他人都醒了,老实说...
-
干得好!这是您的第一个问题,您提供了我们需要的所有相关信息来帮助您。您会惊讶于有多少人在第一次尝试时无法做到这一点!
标签: c# json visual-studio list