C# 反序列化c中包含数组的Json数据
我在反序列化Json消息中的另一个列表时遇到问题。 我的代码可以很好地读取数据,比如Project,Ref,Latitude。。。 我也尝试了两种方法:列表和数组 例如,我的JSON消息:C# 反序列化c中包含数组的Json数据,c#,json,list,serialization,C#,Json,List,Serialization,我在反序列化Json消息中的另一个列表时遇到问题。 我的代码可以很好地读取数据,比如Project,Ref,Latitude。。。 我也尝试了两种方法:列表和数组 例如,我的JSON消息: [{ "Project":"example", "Ref":"001BC50C70000A21", "Latitude":43.643166, "Longitude":1.454769, "ParkList": [{ "Id":"001BC50C
[{
"Project":"example",
"Ref":"001BC50C70000A21",
"Latitude":43.643166,
"Longitude":1.454769,
"ParkList": [{
"Id":"001BC50C70000A21P1",
"State":1,
"DateTime":"2018-02-15T08:07:18.987Z"
}, {
"Id":"001BC50C70000A21P2",
"State":1,
"DateTime":"2018-02-15T08:11:41.824Z"
}]
}]
我的班级:
[DataContract]
public class KMessage
{
private string ProjectField;
private string RefField;
private float LatitudeField;
private float LongitudeField;
public List<TParkList> ParkList { get; set; }
[DataMember]
public string Project
{
get
{
return this.ProjectField;
}
set
{
this.ProjectField = value;
}
}
[DataMember]
public string Ref
{
get
{
return this.RefField;
}
set
{
this.RefField = value;
}
}
[DataMember]
public float Latitude
{
get
{
return this.LatitudeField;
}
set
{
this.LatitudeField = value;
}
}
[DataMember]
public float Longitude
{
get
{
return this.LongitudeField;
}
set
{
this.LongitudeField = value;
}
}
}
[DataContract]
public class TParkList
{
private string IdField;
private int StateField;
private string DateTimeField;
[DataMember]
public string Id
{
get
{
return this.IdField;
}
set
{
this.IdField = value;
}
}
[DataMember]
public int State
{
get
{
return this.StateField;
}
set
{
this.StateField = value;
}
}
[DataMember]
public string DateTime
{
get
{
return this.DateTimeField;
}
set
{
this.DateTimeField = value;
}
}
}
以及测试的主要代码。因此,kmsg.ParkList的列表为空:
[ServiceContract]
public interface IKService
{
[DataContractFormat]
[OperationContract]
[WebInvoke(
Method = "POST",
BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "/state")]
void Service(Stream KStream);
}
public class KService : IKService
{
public void Service(Stream KStream)
{
try
{
if (KStream == null)
{
MessageBox.Show("WebService message is NULL");
}
else
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<KMessage>));
var obj = (List<KMessage>)serializer.ReadObject(KStream);
foreach (KMessage kmsg in obj)
{
MessageBox.Show("Project", kmsg.Project);
foreach (var pklist in kmsg.ParkList)
{
MessageBox.Show("List - Id", pklist.Id.ToString());
}
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
感谢您的帮助。您没有在KMessage中声明您的列表为数据合约的成员。 这意味着它不可序列化 尝试将其添加到类KMessage中
可以使用VisualStudio提供的函数将json转换为模型类 转到:编辑->粘贴特殊->将JSON粘贴为类 由此功能创建的模型类将解决您的问题 我使用了这个特性并为您创建了模型类
//Use respective attributes
public class KMessage
{
public string Project { get; set; }
public string Ref { get; set; }
public float Latitude { get; set; }
public float Longitude { get; set; }
//I guess here is the problem, instead of array you can use list
public Parklist[] ParkList { get; set; }
}
public class Parklist
{
public string Id { get; set; }
public int State { get; set; }
public DateTime DateTime { get; set; }
}
我猜您在反序列化时遗漏了一些东西,下面是如何反序列化json字符串。我正在使用图书馆
概念证明:感谢您向我展示了一个我不知道的好特性。我用这种方法开始构建类。我再试了一次,问题还是一样的。我只是添加了[DataContract]和[DataMember],没有代码,在第一个foreach中没有输入代码,它们使用相同的模型类再次工作,但问题是相同的。在第二个foreach中,由于parklist是空的,所以程序进入捕获状态。我使用的是库Newtonsoft.Json。我首先在我的第一个foreach中尝试您的代码,所以当我发布Json消息时,我会在您的代码中输入testparklist类作为开始。但它们也不起作用。jsonString是ok的,而对于System.Collections.Generic.List类型,kMsg是null。我不明白为什么在第一个foreach循环中,每个字段都有数据,而ParkList数组是空的。所以当我尝试反序列化对象时,我反序列化空对象。我尝试在KMessage中声明此列表,但也不起作用。我的kmsg.ParkList还是一个空数组。@PouLpeX我更新了我的答案,对于您的json字符串代码也可以正常工作。请检查它是否显示会导致无限递归。但是[DataMember]在自动实现的属性上运行良好,因此无需切换到显式实现。我更新了答案,请检查,这可能会有所帮助。。实施:
//Use respective attributes
public class KMessage
{
public string Project { get; set; }
public string Ref { get; set; }
public float Latitude { get; set; }
public float Longitude { get; set; }
//I guess here is the problem, instead of array you can use list
public Parklist[] ParkList { get; set; }
}
public class Parklist
{
public string Id { get; set; }
public int State { get; set; }
public DateTime DateTime { get; set; }
}
string jsonString = "[{\"Project\":\"example\", \"Ref\":\"001BC50C70000A21\", \"Latitude\":43.643166, \"Longitude\":1.454769, \"ParkList\": [{\"Id\":\"001BC50C70000A21P1\", \"State\":1, \"DateTime\":\"2018-02-15T08:07:18.987Z\"}, {\"Id\":\"001BC50C70000A21P2\",\"State\":1,\"DateTime\":\"2018-02-15T08:11:41.824Z\"}]}]";
//You used [square brackets] at first, so we need to deserialize with list
List<KMessage> kMsg = JsonConvert.DeserializeObject<List<KMessage>>(jsonString);
foreach (Parklist item in kMsg[0].ParkList)
{
Console.WriteLine("Id: " + item.Id + " State: " + item.State + " DateTime: " + item.DateTime);
}
Output:
Id: 001BC50C70000A21P1 State: 1 DateTime: 2/15/2018 8:07:18 AM
Id: 001BC50C70000A21P2 State: 1 DateTime: 2/15/2018 8:11:41 AM