反序列化 Json XYZ 点

2023-12-31

Autodesk Revit 开发

我将 XYZ 点从容器(点和标签)中序列化为类(点)到文件。

public class Serialize_pack
{
    public View_3D_Data v3ddata;
    public Tag_Class tg;
}

通过这个方法

public static void serializeme(object classme)
{
    string coor_file = constants.SenddDir() + constants.filename();

    using (StreamWriter file = File.CreateText(coor_file))
    {
        JsonSerializer serializer = new JsonSerializer();

        serializer.Serialize(file, classme);
    }
}

我得到了这个结果

{"点":{"bboxmin":{"Z":-1000.0,"Y":-100.0,"X":-100.0},"bboxmax":{"Z":-0.1,"Y":100.0 ,"X":100.0}},"tg":{"eId":"666470","text":"coor: 吻我"}}

反序列化时,我得到的所有点的结果均为 (0.0,0.0,0.0) 值,这是无法将读取值解析为其合适类型的结果。

反序列化方法

public static object deserializeme(string path)
{
    Serialize_pack accquired = null;
    using (StreamReader file = File.OpenText(path))
    {
        JsonSerializer serializer = new JsonSerializer();
        accquired = (Serialize_pack)serializer.Deserialize(file, typeof(Serialize_pack));                           
    }

    return accquired;
}

我希望我能找到一种好方法来转换和克服这个混乱。

编辑:精确的 Newton.JSon 输出

{"点":{"bboxmin":{"Z":-1000.0,"Y":-100.0,"X":-100.0},"bboxmax":{"Z":-0.1,"Y":100.0 ,"X":100.0},"sboxmin":{"Z":-10.277690406517843,"Y":-13.533464566929133,"X":-13.389107611548557},"sboxmax":{"Z":16.510826771653544 ,“Y”: 13.533464566929133,"X":13.389107611548557},"vorEyP":{"Z":30.114082470913921,"Y":34.471718543415037,"X":-7.7202528373680934} ,"vorFwD":{"Z":-0.57735026918962573,"Y": -0.57735026918962584,"X":0.57735026918962573},"vorUP":{"Z":0.816496580927726,"Y":-0.408248290463863,"X":0.40824829046386296}, "v3dname":"Arch_Moustafa-GAJ-145834"},"标签":{"eId":"666470","origin":{"Z":1154.5239372729186,"Y":1164.3934060532893,"X":-1119.6229882673815},"text":"coor: 吻我","ledelbo" :{“Z”:1157.6807845880096,“Y”:1163.9955344285622,“X”:-1116.8640125770175}}}

标签类

public class Tag
{
    public string eId;

    public XYZ origin;
    public string text;
    public XYZ ledelbo;

public void getTagdata(View v)
    {
        ///we need all the annotation to be sent.
       /// do some stuff and cast the results on the public variables

    }
}

积分等级

public class Points
{

    public XYZ bboxmin;
    public XYZ bboxmax;
    public XYZ sboxmin;
    public XYZ sboxmax;

    public XYZ vorEyP;
    public XYZ vorFwD;
    public XYZ vorUP;

    public string v3dname;


    [JsonIgnore]
    public View3D view;

 public void get3dviewdata()
    {
       ///we need all the points to be sent.
       /// do some stuff and cast the results on the public variables
    }
}

好吧,这里的问题似乎是XYZ类 http://revitapisearch.com/html/b9b10e41-46c7-7e9b-bbd9-b6180e328d4d.htm在 Revit 中是不可变的 http://thebuildingcoder.typepad.com/blog/2010/04/xyz-immutable.html, 所以JsonSerializer无法设置属性。一般情况下处理这个问题的方法是为你的类装饰一个合适的构造函数JsonConstructorAttribute https://stackoverflow.com/questions/9085676/is-there-a-way-to-use-json-net-deserialization-with-immutable-classes- 但你不能那样做,因为XYZ is a Revit班级,不是你自己的。

解决方案#1

要解决这个问题,您可以子类化XYZ并用该属性装饰适当的构造函数 - 但是,我不确定 Revit 类是否是密封的,或者如果您实际上将这些子类 XYX 之一传递回 Revit,这是否会产生不可预见的副作用。或者,您可以引入纯粹用于序列化和反序列化的代理类:

public static class XYZProxyExtensions
{
    public static XYZProxy ToXYZProxy(this XYZ xyz)
    {
        return new XYZProxy(xyz.X, xyz.Y, xyz.Z);
    }
}

public class XYZProxy
{
    public XYZProxy()
    {
        this.X = this.Y = this.Z = 0;
    }

    public XYZProxy(double x, double y, double z)
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }
    public double X { get; set; }
    public double Y { get; set; }
    public double Z { get; set; }

    public XYZ ToXYZ()
    {
        return new XYZ(X, Y, Z);
    }
    public override string ToString()
    {
        return string.Format("({0},{1},{2})", X, Y, Z);
    }
}

完成此操作后,您可以将代理属性添加到自定义类,将它们标记为隐藏在调试器中,并告诉 Json.Net 序列化代理,而不是原始属性:

[JsonObject(MemberSerialization.OptIn)]
public class Points
{
    public XYZ bboxmin { get; set; }

    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    [JsonProperty(PropertyName = "bboxmin")]
    public XYZProxy bboxminProxy
    {
        get
        {
            return bboxmin.ToXYZProxy();
        }
        set
        {
            bboxmin = value.ToXYZ();
        }
    }
}

更多信息请点击这里:http://www.tecsupra.com/serializing-only-some-properties-of-an-object-to-json-using-newtonsoft-json-net/ http://www.tecsupra.com/serializing-only-some-properties-of-an-object-to-json-using-newtonsoft-json-net/和这里:使用 Json.net 序列化时如何更改属性名称? https://stackoverflow.com/questions/8796618/how-can-i-change-property-names-when-serializing-with-json-net

解决方案#2

或者,你可以尝试写你自己的JsonConverter https://stackoverflow.com/questions/20623565/json-net-custom-serialization-deserialization-of-a-third-party-type for XYZ进而使用 Json.Net 注册它 https://stackoverflow.com/questions/19510532/registering-a-custom-jsonconverter-in-json-net。转换器可能看起来像这样(警告 - 未经测试!)

class XYZConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(XYZ);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var obj = JToken.Load(reader);
        if (obj.Type == JTokenType.Array)
        {
            var arr = (JArray)obj;
            if (arr.Count == 3 && arr.All(token => token.Type == JTokenType.Float))
            {
                return new XYZ(arr[0].Value<double>(), arr[1].Value<double>(), arr[2].Value<double>());
            }
        }
        return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var vector = (XYZ)value;
        writer.WriteStartArray();
        writer.WriteValue(vector.X);
        writer.WriteValue(vector.Y);
        writer.WriteValue(vector.Z);
        writer.WriteEndArray();
    }
}

这会产生如下所示的 Json:

"bboxmin": [ -100.0, -100.0, -1000.0 ]

这种格式可能更好也可能更差;您是否正在尝试向某些预先存在的第 3 方库读取和写入文件?]

第二次解决方案更新

您需要创建JsonSerializer使用适当的设置来调用转换器,只需执行以下操作new JsonSerializer()不管用。我测试了以下内容,效果很好(这里是我的课程版本Points只有 4 个字段):

public static class JsonSerializerTest
{
    static JsonSerializerTest()
    {
        // This needs to be done only once, so put it in an appropriate static initializer.
        JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            Converters = new List<JsonConverter> { new XYZConverter() }
        };
    }

    public static void Test()
    {
        Points points = new Points();
        points.bboxmin = new XYZ(-100, -100, -1000);
        points.bboxmax = new XYZ( 100,  100,  1000);
        points.sboxmin = new XYZ(-10, -10, -100);
        points.sboxmax = new XYZ( 10, 10, 100);

        try
        {
            string json;
            using (var writer = new StringWriter())
            {
                JsonSerializer serializer = JsonSerializer.CreateDefault();
                serializer.Serialize(writer, points);
                json = writer.ToString();
            }

            Points newPoints = null;
            using (var reader = new StringReader(json))
            {
                JsonSerializer serializer = JsonSerializer.CreateDefault();
                newPoints = (Points)serializer.Deserialize(reader, typeof(Points));
            }

            Debug.Assert(points.bboxmin.IsAlmostEqualTo(newPoints.bboxmin));
            Debug.Assert(points.bboxmax.IsAlmostEqualTo(newPoints.bboxmax));
            Debug.Assert(points.sboxmin.IsAlmostEqualTo(newPoints.sboxmin));
            Debug.Assert(points.sboxmax.IsAlmostEqualTo(newPoints.sboxmax));
        }
        catch (Exception ex)
        {
            Debug.Assert(false, ex.ToString());
        }
    }
}

生成的 Json 输出非常简单且可读:

{"bboxmin":[-100.0,-100.0,-1000.0],"bboxmax":[100.0,100.0,1000.0],"sboxmin":[-10.0,-10.0,-100.0],"sboxmax":[10.0,10.0,100.0]}

这避免了对代理的需求,因此可能是一个更漂亮的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反序列化 Json XYZ 点 的相关文章

  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 按成员序列化

    我已经实现了template
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 如何格式化 Json 输出

    请帮助我如何获取 JSON 输出 如下所示 costMethod Average fundingDate 2008 10 02 fundingAmount 2510959 95 代替 type sma costMethod Average
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • GitHub Actions:如何将 toJSON() 结果传递给 shell 命令

    因此 我正在与 Github Actions 合作进行端到端测试 我正在查看的设置是让一项作业检索要测试的 url 列表 而我的第二项作业使用该列表创建一个矩阵并测试所有这些 我的问题是 当我实际运行测试脚本时 必须从命令行完成 因为我使用
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P

随机推荐

  • 是否有重新启动集群的最佳实践

    我遵循亚历克斯埃利斯的优秀tutorial https gist github com alexellis fdbc90de7691a1b9edb545c17da2d975使用kubeadm在 Raspberry Pi 上启动 K8s 集群
  • Gitignore 不忽略文件夹

    我已将多个文件夹添加到我的 gitignore文件 但当我这样做时它们仍然出现git status 我的安装 计算机是新的 我正在尝试在 svn 中初始化 git 存储库 正如我之前所做的数百次一样 尽管不是在这台机器上 文件夹被标记为忽
  • 如何在 ActiveMQ 5.2 中打开 JMX

    在 ActiveMQ 5 2 中启用 JMX 的正确方法是什么 我见过相互冲突的文档 所以我想知道是否有人知道正确的配置文件更改应该是什么 我想我可以通过更改用于启动 ActiveMQ 的批处理文件来使其工作 但我真的不知道
  • Android应用程序中的语音检测

    描述 我的应用程序记录手机麦克风的声音 我正在使用 android 标准类 android media AudioRecord 要做到这一点 应用程序有 2 个按钮 Start and Stop 当我按下start按钮应用程序开始记录 当我
  • 根据色调名称更改条形颜色

    我在用着seaborn and pandas从不同 但相关 的数据创建一些条形图 这两个数据集共享一个共同的类别 用作hue 因此我想确保在两个图表中该类别的条形颜色匹配 我该怎么办 一个基本的例子如下 import seaborn as
  • Oracle SQL:导出到 CSV 避免换行

    我需要批量导出每天 csv 文件中数据库的一些数据 实际上 我正在使用 SET COLSEP 命令 但在导出大小为 4000 VARCHAR2 4000 的大列时遇到一些问题 它在输出文件上返回给我许多空行和换行符 我将尝试用一个例子更好地
  • Visual Studio SSIS 项目 - 脚本任务生成错误

    我想学习在我的个人计算机上开发 SSIS 包 我对编写 C 脚本感兴趣 我使用 SSDT 在 Windows 10 Pro 64 位上安装了 Visual Studio 2019 还安装了 Integration Services Proj
  • PhpMyAdmin:“处理请求时出错:”(未显示错误)

    我在 Windows 10 64 位 上运行 XAMPP 作为开发环境 PhpMyAdmin 最近开始回复每一次尝试的操作 并出现以下错误 没有任何有关该错误的实际信息 我怎样才能继续前进而不收到错误 不起作用的行动 删除行 删除表 Edi
  • 在 Javascript 中启用和禁用 Div 及其元素[重复]

    这个问题在这里已经有答案了 我正在寻找一种方法启用和禁用这div id dcalc 和它的孩子 div class nerkheArz style width 380px height 370px background CDF text a
  • Bash 参数替换中 :- 和 := 有什么区别?

    Bash 参数替换中 和 有什么区别 他们似乎都设置了默认值 Quoting Bash 参考手册 https www gnu org software bash manual bashref html Shell Parameter Exp
  • 如何诊断 Java 8 元空间泄漏?

    我有一个具有一些有趣行为的 J2EE 应用程序 堆似乎表现良好 随着时间的推移 随着垃圾收集的进行而增长和收缩 总体上没有明显的长期堆扩展 然而 元空间一直以每小时 20 Mb 左右的速度稳定增长 直到达到 MaxMetaspace 并遇到
  • 如何将具有 0 值字节的 char * 转换为 python 字符串?

    使用 ctypes 模块 我可以轻松地将 POINTER c char 或 c char p 类型导入到 python 中 但这两种方法都没有提供一种方法来最终得到包含零值字节的 python 字符串 c char p 以零终止 这意味着
  • Marshmallow 序列化与父字段嵌套

    抱歉 如果之前有人问过这个问题 我实际上找不到解决方案或类似的问题 可能使用了错误的词语 我正在更新现有的 Flask API 该 API 使用 marshmallow 和 peewee 从我们无法控制的客户端接收数据 无法更改 JSON
  • '类型NSNull无法转换为NSString' aria-label='反应本机AsyncStorage firebase JSON值''类型NSNull无法转换为NSString'> 反应本机AsyncStorage firebase JSON值''类型NSNull无法转换为NSString

    我在用AsyncStorage存储一些 Firebase 用户数据 AsyncStorage setItem firebaseUser JSON stringify data 当我尝试检索数据时 React Native 因以下错误而崩溃
  • 如何让gradle在项目根目录为maven用户生成有效的pom.xml文件?

    虽然现在只有两天 但我绝对愿意在我的所有 Java 项目中使用 gradle 并从我所有项目的根目录中删除 pom xml 但是 我希望保持与 maven 兼容 因为我希望 gradle 任务能够在用户需要的情况下在项目的根目录生成合适的
  • MongoDB 设计 - 标签

    我是 MongoDB 新手 我有一个关于 MongoDB 性能的设计问题 假设我的电影类有两个属性 名称和导演 我还想标记这个电影类 是向此类添加一个新的 strings 属性 还是创建一个新类 MovieTags 更好 我知道我会经常查询
  • J2ME 就像 Android 上的 Sprite

    对于本月无用的项目 我正在开发一个 模拟器 来在 Android 上运行 J2ME 程序 但现在我被 J2ME Sprite 实现困住了 特别是其中使用的转换 在我的 Sprite 中 我有一个包含三个角色图像的位图 我想将第二个框架绘制为
  • org.apache.tomcat.dbcp.dbcp.SQLNestedException:无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序

    你好 当我尝试使用 JNDI 连接到数据源时 出现以下错误 org apache tomcat dbcp dbcp SQLNestedException Cannot create JDBC driver of class for conn
  • Web服务命名空间动态命名

    我有一个web service我将部署到开发 登台和生产 与此同时 还将有一个ASP net将单独部署但也在这三个阶段中的应用程序 更改 Web 服务中的以下行以匹配当前环境的最实用方法是什么 WebService Namespace ht
  • 反序列化 Json XYZ 点

    Autodesk Revit 开发 我将 XYZ 点从容器 点和标签 中序列化为类 点 到文件 public class Serialize pack public View 3D Data v3ddata public Tag Class