Json C#:反序列化更改的内容或Json响应片段
我使用的Api并非每次都返回基于所需位置的相同响应。有些地方有更多的细节,有些内容比其他地方有更多的属性。每次生成的序列化对象都不相同,导致不匹配时出现反序列化错误。该项目的目标不是匹配整个内容响应,而是仅匹配该内容的一部分:质心Json C#:反序列化更改的内容或Json响应片段,c#,json,deserialization,C#,Json,Deserialization,我使用的Api并非每次都返回基于所需位置的相同响应。有些地方有更多的细节,有些内容比其他地方有更多的属性。每次生成的序列化对象都不相同,导致不匹配时出现反序列化错误。该项目的目标不是匹配整个内容响应,而是仅匹配该内容的一部分:质心 { "place":{ "woeid":12345, "placeTypeName":"State", "placeTypeName attrs":{ "code":8 }, "nam
{
"place":{
"woeid":12345,
"placeTypeName":"State",
"placeTypeName attrs":{
"code":8
},
"name":"My Region",
"country":"",
"country attrs":{
"type":"Country",
"code":"XX"
},
"admin1":"My Region",
"admin1 attrs":{
"type":"Region",
"code":""
},
"admin2":"",
"admin3":"",
"locality1":"",
"locality2":"",
"postal":"",
"centroid":{
"latitude":30.12345,
"longitude":40.761292
},
"boundingBox":{
"southWest":{
"latitude":32.2799,
"longitude":50.715958
},
"northEast":{
"latitude":29.024891,
"longitude":12.1234
}
},
"areaRank":10,
"popRank":0,
"uri":"http:\/\/where.yahooapis.com",
"lang":"en-US"
}
}
有人能指出反序列化一段内容而不是完整响应(质心不在同一位置)或反序列化不断变化的响应模式的最佳方法吗
我使用ServiceStack C#序列化程序,但欢迎所有建议。谢谢。您可以使用DataContractJsonSerializer,它是标准.NET框架的一部分。您只定义您感兴趣的属性。其他的将被忽略
class CentroidReader
{
public static Centroid ReadControid(Stream stream)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Response));
Response response = serializer.ReadObject(stream) as Response;
return response.Place.Centroid;
}
}
[DataContract]
class Response
{
[DataMember(Name = "place")]
public Place Place { get; set; }
}
[DataContract]
class Place
{
[DataMember(Name = "centroid")]
public Centroid Centroid { get; set; }
}
[DataContract]
class Centroid
{
[DataMember(Name = "latitude")]
public double? Latitude { get; set; }
[DataMember(Name = "longitude")]
public double? Longitude { get; set; }
}
实际上,有几种方法可以使用ServiceStack的JsonSerializer对此进行解析,如图所示 我会采用JsonObject的方法来完成您选择的C#类,尽管它需要的不仅仅是ServiceStack的JsonSerializer所使用的1行程序。无论如何,下面是生成的代码:
Func<JsonObject, Centroid> toCentroid = map =>
new Centroid(map.Get<decimal>("latitude"), map.Get<decimal>("longitude"));
var place = JsonObject.Parse(JsonCentroid)
.Object("place")
.ConvertTo(x => new Place
{
WoeId = x.Get<int>("woeid"),
PlaceTypeName = x.Get(""),
PlaceTypeNameAttrs = x.Object("placeTypeName attrs"),
Name = x.Get("Name"),
Country = x.Get("Country"),
CountryAttrs = x.Object("country attrs"),
Admin1 = x.Get("admin1"),
Admin1Attrs = x.Object("admin1 attrs"),
Admin2 = x.Get("admin2"),
Admin3 = x.Get("admin3"),
Locality1 = x.Get("locality1"),
Locality2 = x.Get("locality2"),
Postal = x.Get("postal"),
Centroid = x.Object("centroid")
.ConvertTo(toCentroid),
BoundingBox = x.Object("boundingBox")
.ConvertTo(y => new BoundingBox
{
SouthWest = y.Object("southWest").ConvertTo(toCentroid),
NorthEast = y.Object("northEast").ConvertTo(toCentroid)
}),
AreaRank = x.Get<int>("areaRank"),
PopRank = x.Get<int>("popRank"),
Uri = x.Get("uri"),
Lang = x.Get("lang"),
});
Func-toCentroid=map=>
新的质心(map.Get(“纬度”)、map.Get(“经度”);
var place=JsonObject.Parse(JsonCentroid)
.对象(“地点”)
.ConvertTo(x=>新位置
{
WoeId=x.Get(“WoeId”),
PlaceTypeName=x.Get(“”),
PlaceTypeNameAttrs=x.Object(“placeTypeName attrs”),
Name=x.Get(“Name”),
国家=x.Get(“国家”),
CountryAttrs=x.Object(“国家属性”),
Admin1=x.Get(“Admin1”),
Admin1Attrs=x.Object(“admin1属性”),
Admin2=x.Get(“Admin2”),
Admin3=x.Get(“Admin3”),
Locality1=x.Get(“Locality1”),
Locality2=x.Get(“Locality2”),
邮政=x.Get(“邮政”),
质心=x.对象(“质心”)
.ConvertTo(toCentroid),
BoundingBox=x.Object(“BoundingBox”)
.ConvertTo(y=>新边界框
{
西南=y.Object(“西南”).ConvertTo(toCentroid),
东北=y.Object(“东北”).ConvertTo(toCentroid)
}),
AreaRank=x.Get(“AreaRank”),
PopRank=x.Get(“PopRank”),
Uri=x.Get(“Uri”),
Lang=x.Get(“Lang”),
});
以下是。只是一个想法。我已经格式化了JSON数据,这样我们可以更好地了解您在说什么。谢谢Codo。我喜欢使用ServiceStack获得其他人的响应。