C# 反序列化对象不返回Xamarin.Forms中的完整数据

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

我有一个JSON对象,它基于用户键入的关键字返回。它只从用户返回部分键入的关键字。当我检查postman并键入相同的关键字时,它会正确返回

引发了以下异常:

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中测试相同的关键字时,我得到了正确的列表,但当我用应用程序测试时,我不知道你是否比较了原始的关键字