首页 > 其他分享 >.NET|--杂类|--json文件未释放, 就开始反序列化, 报错Newtonsoft.Json Unexpected character encountered while parsing val

.NET|--杂类|--json文件未释放, 就开始反序列化, 报错Newtonsoft.Json Unexpected character encountered while parsing val

时间:2024-07-18 18:19:53浏览次数:6  
标签:shpFilePath string -- 报错 Gdal 序列化 OSGeo GDAL

前言


一个看起来很莫名其妙的错误, json文件我打开看了下, 格式也都正确,

但是在vs中调试的时候, 监视 -- 查看 -- JSON可视化工具
查看json字符串的话, 
会提示"字符串未设置为JSON格式",

"监视 -- 查看 -- 文本可视化工具", 发现json格式确实看不出来任何问题.

报错

# 报错的代码( 就是这行代码报错的 ...)
var geoJsonObject = JObject.Parse(geoJson);
# 详细错误
Newtonsoft.Json.JsonReaderException:“Unexpected end of content while loading JObject. Path 'features[1962]', line 1967, position 7249.”

解决方案


我这个json文件是通过GDAL生成出来的, 而我生成出来后, 并没有把相关资源关闭, 
猜测可能会导致缓冲区中的数据未正确刷新到磁盘,这可能使得文件的部分内容丢失或不完整?

错误代码↓

# 错误代码

/// <summary>
/// 将Shp文件转换为GeoJson格式文件
/// </summary>
/// <param name="shpFilePath"></param>
/// <param name="geoJSONFilePath"></param>
/// <returns></returns>
public static bool Convert2GeoJSONFile(string shpFilePath, string geoJSONFilePath)
{
    bool isOk = false;

    GdalConfiguration.ConfigureGdal();
    GdalConfiguration.ConfigureOgr();

    if (string.IsNullOrWhiteSpace(shpFilePath) || string.IsNullOrWhiteSpace(geoJSONFilePath))
    {
        throw new ArgumentException("输入参数路径不合法");
    }

    OSGeo.GDAL.Gdal.AllRegister();
    OSGeo.OGR.Ogr.RegisterAll();

    // 为了支持中文路径,请添加下面这句代码
    OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
    // 为了使属性表字段支持中文,请添加下面这句
    OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "");

    Gdal.SetConfigOption("DXF_ENCODING", "UTF-8");

    //打开数据
    DataSource ds = Ogr.Open(shpFilePath, 0);
    if (ds == null)
    {
        throw new Exception($"打开文件失败{shpFilePath}");
    }
    using OSGeo.OGR.Driver dv = Ogr.GetDriverByName("GeoJSON");
    if (dv == null)
    {
        throw new Exception($"打开驱动失败:GeoJSON");
    }

       
    // 注意这行代码****************************就是这行代码的锅*********************************************************************************↓↓↓↓↓↓↓↓↓↓↓
    var ret = dv.CopyDataSource(ds, geoJSONFilePath, null);

    isOk = true;
    return isOk;
}

正确代码↓

/// <summary>
/// 将Shp文件转换为GeoJson格式文件
/// </summary>
/// <param name="shpFilePath"></param>
/// <param name="geoJSONFilePath"></param>
/// <returns></returns>
public static bool Convert2GeoJSONFile(string shpFilePath, string geoJSONFilePath)
{
    bool isOk = false;

    GdalConfiguration.ConfigureGdal();
    GdalConfiguration.ConfigureOgr();

    if (string.IsNullOrWhiteSpace(shpFilePath) || string.IsNullOrWhiteSpace(geoJSONFilePath))
    {
        throw new ArgumentException("输入参数路径不合法");
    }

    OSGeo.GDAL.Gdal.AllRegister();
    OSGeo.OGR.Ogr.RegisterAll();

    // 为了支持中文路径,请添加下面这句代码
    OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
    // 为了使属性表字段支持中文,请添加下面这句
    OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "");

    Gdal.SetConfigOption("DXF_ENCODING", "UTF-8");

    //打开数据
    DataSource ds = Ogr.Open(shpFilePath, 0);
    if (ds == null)
    {
        throw new Exception($"打开文件失败{shpFilePath}");
    }
    using OSGeo.OGR.Driver dv = Ogr.GetDriverByName("GeoJSON");
    if (dv == null)
    {
        throw new Exception($"打开驱动失败:GeoJSON");
    }
     // *********************************加上using即可*********************************↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    // 一定要加using, 否则生成的geoJSONFilePath一直被占用, 并且反序列化JSON的时候会报错 : Newtonsoft.Json Unexpected character encountered while parsing value: .Path...
    using var ret = dv.CopyDataSource(ds, geoJSONFilePath, null);

    isOk = true;
    return isOk;
}

摘抄文档

标签:shpFilePath,string,--,报错,Gdal,序列化,OSGeo,GDAL
From: https://www.cnblogs.com/love-zf/p/18310205

相关文章

  • 16 触发器
    概念触发器trigger是一种特殊类型的存储过程。触发器主要是通过事件进行触发而被执行,而存储过程是可以直接通过存储过程的名字被调用执行触发器的作用1、可以在写入数据表前,强制检验或转换数据,以保证数据安全2、触发器发生错误时,异动的结果会被撤销如果触发器执行发生错误......
  • unity3d get post请求
    unity3dget post请求 usingUnityEngine;usingUnityEngine.Networking;publicclassNetworkRequestExample:MonoBehaviour{IEnumeratorStart(){stringurl="https://api.example.com/data";UnityWebRequestrequest=U......
  • .NET|--杂类|--将Shp文件转为GeoJson-通过GDAL
    前言真实需求是将Shp转为pbf文件,不过我现在已经实现了,将GeoJson格式数据转换为pbf文件,所以需要实现将Shp文件转换为GeoJson格式即可.1.下载GDAL的程序集下载地址→https://www.gisinternals.com/development.php下载完成,解压zip文件,可以看到这些dll文件(路......
  • C# annoymous object contain array
    privatevoidSerializeDemo(){varobj=new[]{new{CountryId=1,CountryName="USA",StateList=new[]{new[]{......
  • Mac使用Charles抓包并且解决中文乱码
    1.安装软件直接去官网下载,这里就不多比比了。2.激活下载好之后打开界面,点击help->register输入下面这个,如果不能使用再百度一下,多得很RegisteredName:https://zhile.ioLicenseKey:48891cf209c6d32bf4123.解决乱码问题:Proxy->SSLProxyingSettings,勾选EnableSSLProxying,点......
  • 前端WebSocket的方法封装
    一、封装方法在项目根目录src下的utils中新增webSocketManager.js封装文件,代码内容如下://webSocketManager.js/**WebSocketMessenger封装类*/classWebSocketManager{constructor(url=null,userId=null,receiveMessageCallback=null){this.socket=nul......
  • 8个软件和渲染农场:让3D建模和渲染变得简单
    3D建模和渲染已成为艺术与技术的交汇点,尽管这一领域充满挑战,但总有一些工具和资源能让用户使用变得不那么艰难。今天,我们将探讨“8个软件和渲染农场:让3D建模和渲染变得简单”,这些工具不仅简化了建模和渲染的过程,还通过渲染农场技术,使得即使是资源有限的个人也能享受到专业的渲染效......
  • Ubuntu 安装docker
    一、docker安装本文主要是基于Ubuntu18.04操作系统安装docker的方法,本文基本涵盖基于前人所有可行的安装步骤与基础使用方法,由于笔者使用默认存储库在Ubuntu上成功安装了docker,因此主要首先介绍该方法和一些基础的使用操作。第1步:更新软件存储库更新本地软件数据库以确保可以访......
  • 拓扑排序 + 习题
    P4017最大食物链计数 题目链接:https://www.luogu.com.cn/problem/P4017题意:给你一个食物网,求出这个最大食物链的数量最大食物链定义为左端不会捕食其他捕食者,最右端不会被捕食.解释看例子第1行nm表示生物种类n和吃和被吃的关系m接下来m行AB表示A被B吃.........
  • 视频联网共享平台LntonCVS视频监控汇聚平台视频云解决方案
    LntonCVS流媒体平台是一款遵循国家GB28181标准协议的先进视频监控与云服务平台。该平台设计独特,能够同时接入并处理多路设备的视频流,支持包括RTSP、RTMP、FLV、HLS、WebRTC在内的多种视频流格式的分发。其功能丰富多样,涵盖了视频直播监控、云端录像存储、高效的云存储解决方案......