C# 反序列化对象不返回Xamarin.Forms中的完整数据
我有一个JSON对象,它基于用户键入的关键字返回。它只从用户返回部分键入的关键字。当我检查postman并键入相同的关键字时,它会正确返回 引发了以下异常:C# 反序列化对象不返回Xamarin.Forms中的完整数据,c#,xamarin.forms,json.net,C#,Xamarin.forms,Json.net,我有一个JSON对象,它基于用户键入的关键字返回。它只从用户返回部分键入的关键字。当我检查postman并键入相同的关键字时,它会正确返回 引发了以下异常: Newtonsoft.Json.JsonSerializationException: 必须在字符串中指定用于分析的有效信息 JSON { "valid": true, "result": { "points": [ { "pointId": "505", "name": "Bu
Newtonsoft.Json.JsonSerializationException:
必须在字符串中指定用于分析的有效信息
JSON
{
"valid": true,
"result": {
"points": [
{
"pointId": "505",
"name": "Building one",
"description": "Office of Technology and Data Application Development",
"latitude": "xxx",
"longitude": "xxx",
"floor": "B",
"aliases": [],
"comments": [],
"images": []
}
],
"categories": []
},
"errors": []
}
模型类
public class SearchPoints
{
public bool Valid { get; set; }
public Result Result { get; set; }
public List<string> Errors { get; set; }
}
public class Result
{
public List<Point> Points { get; set; }
public List<Category> Categories { get; set; }
}
public class Category
{
public long CategoryId { get; set; }
public string Name { get; set; }
public long ParentId { get; set; }
public string Parent { get; set; }
}
public class Point
{
public long PointId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Latitude { get; set; }
public string Longitude { get; set; }
public Floor Floor { get; set; }
public List<string> Aliases { get; set; }
public List<string> Comments { get; set; }
public List<string> Images { get; set; }
}
public enum Floor
{
A,
B
};
公共类搜索点
{
公共布尔有效{get;set;}
公共结果结果{get;set;}
公共列表错误{get;set;}
}
公开课成绩
{
公共列表点{get;set;}
公共列表类别{get;set;}
}
公共类类别
{
公共长类别ID{get;set;}
公共字符串名称{get;set;}
公共长父ID{get;set;}
公共字符串父项{get;set;}
}
公共课点
{
公共长点ID{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共字符串纬度{get;set;}
公共字符串经度{get;set;}
公共楼层{get;set;}
公共列表别名{get;set;}
公共列表注释{get;set;}
公共列表图像{get;set;}
}
公众楼层
{
A.
B
};
服务方法
var apiResponse = await _httpClient.GetAsync(Url + _keyword);
var apiContent = apiResponse.Content.ReadAsStringAsync().Result;
var pointsJsonResponse = JsonConvert.DeserializeObject<SearchPoints>(apiContent);
var potentialPoints = new ObservableCollection<Point>(pointsJsonResponse.Result.Points);
PointsItemSource = potentialPoints;
var apiResponse=await\u httpClient.GetAsync(Url+\u关键字);
var apiContent=apiResponse.Content.ReadAsStringAsync().Result;
var pointsJsonResponse=JsonConvert.DeserializeObject(ApicContent);
var potentialPoints=新的可观察采集点(pointsJsonResponse.Result.Points);
PointsItemSource=潜在点;
我非常确定Json.Net无法反序列化“对象”类型。它需要真正的类型:
因此,将所有的列表
替换为列表
例如:
public List<string> Aliases { get; set; }
public List<string> Comments { get; set; }
public List<string> Images { get; set; }
公共列表别名{get;set;}
公共列表注释{get;set;}
公共列表图像{get;set;}
如果仍然出现错误,则错误在apiContent
变量中,该变量不是正确的json字符串
您还需要将
[JsonConverter(typeof(StringEnumConverter))]
属性放在您的枚举类型上。我很确定Json.Net无法反序列化“对象”类型。它需要真正的类型:
因此,将所有的列表
替换为列表
例如:
public List<string> Aliases { get; set; }
public List<string> Comments { get; set; }
public List<string> Images { get; set; }
公共列表别名{get;set;}
公共列表注释{get;set;}
公共列表图像{get;set;}
如果仍然出现错误,则错误在apiContent
变量中,该变量不是正确的json字符串
您还需要将
[JsonConverter(typeof(StringEnumConverter))]
属性放在您的枚举类型上。问题中显示的JSON成功反序列化到问题中显示的数据模型中,请参阅
但是,问题中显示的异常提供了一些信息。(有些不透明)消息必须指定用于解析的有效信息,根据a,字符串仅在Json.NET源代码中出现一次,特别是在:
如果在解析enum
字符串时,传入值仅包含空格,则相关代码将引发异常。因此,我对您问题中的JSON进行了如下修改:
"floor": " ",
[JsonConverter(typeof(EmptyTolerantStringEnumConverter))]
public Floor Floor { get; set; }
并复制了如下所示的异常:
因此,您必须实际尝试使用Floor
的空值或空白值解析JSON,但由于不可能,因此解析失败。要使此工作正常,您可以:
Point.Floor
更改为字符串:
public string Floor { get; set; }
JSON现在将成功解析。演示小提琴在这里:Floor
的空字符串。to by中显示了一个示例,我在这里对其进行了概括:
public class EmptyTolerantStringEnumConverter : StringEnumConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.String && string.IsNullOrWhiteSpace(reader.Value.ToString()))
// Return a default value. Note if deserializing a nullable enum the default value is null
return Activator.CreateInstance(objectType);
return base.ReadJson(reader, objectType, existingValue, serializer);
}
}
并按如下方式应用:
"floor": " ",
[JsonConverter(typeof(EmptyTolerantStringEnumConverter))]
public Floor Floor { get; set; }
或者,如果您希望将“
映射到可为空的:
[JsonConverter(typeof(EmptyTolerantStringEnumConverter))]
public Floor? Floor { get; set; }
演示小提琴:相关:和。问题中显示的JSON成功反序列化到问题中显示的数据模型中,请参阅 但是,问题中显示的异常提供了一些信息。(有些不透明)消息必须指定用于解析的有效信息,根据a,字符串仅在Json.NET源代码中出现一次,特别是在: 如果在解析
enum
字符串时,传入值仅包含空格,则相关代码将引发异常。因此,我对您问题中的JSON进行了如下修改:
"floor": " ",
[JsonConverter(typeof(EmptyTolerantStringEnumConverter))]
public Floor Floor { get; set; }
并复制了如下所示的异常:
因此,您必须实际尝试使用Floor
的空值或空白值解析JSON,但由于不可能,因此解析失败。要使此工作正常,您可以:
Point.Floor
更改为字符串:
public string Floor { get; set; }
JSON现在将成功解析。演示小提琴在这里:Floor
的空字符串。to by中显示了一个示例,我在这里对其进行了概括:
public class EmptyTolerantStringEnumConverter : StringEnumConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.String && string.IsNullOrWhiteSpace(reader.Value.ToString()))
// Return a default value. Note if deserializing a nullable enum the default value is null
return Activator.CreateInstance(objectType);
return base.ReadJson(reader, objectType, existingValue, serializer);
}
}
并按如下方式应用:
"floor": " ",
[JsonConverter(typeof(EmptyTolerantStringEnumConverter))]
public Floor Floor { get; set; }
或者,如果您希望将“
映射到可为空的:
[JsonConverter(typeof(EmptyTolerantStringEnumConverter))]
public Floor? Floor { get; set; }
演示小提琴:相关:和。您是否将代码中返回的原始json与postman进行了比较?它们是相同的还是不同的?如果它们不同,那么您发布的代码都与解决问题无关。是的,我对它们进行了比较,它们是相同的。那么,当您反序列化时,是否只缺少一些项目?有多少有什么模式吗?@Anthony你是如何发送键入的关键字的?当用户键入或他们有一个提交按钮点击吗?他们的数字是没有多少是失踪的,我不认为有一个模式。当我在postman中测试相同的关键字时,我得到了正确的列表,但当我用应用程序测试时,我不知道你是否比较了原始的关键字