【问题标题】:JavaScriptSerializer with named tuples带有命名元组的 JavaScriptSerializer
【发布时间】:2019-07-25 15:30:02
【问题描述】:

如果我将 JavaScriptSerializer 与命名元组一起使用,我会得到以下信息:

var serialized = new JavaScriptSerializer().Serialize((Foo: "Fooo", Bar: "Bar"));

序列化为:

{"Item1":"F","Item2":"B"}

任何获取方式:

{"Foo":"F","Bar":"B"}

不用用属性 Foo 和 Bar 而不是 tuple 编写自定义类?

【问题讨论】:

    标签: c# json javascriptserializer


    【解决方案1】:

    您尝试过匿名课程吗?

    var serialized = new JavaScriptSerializer().SerializeObject(new {Foo= "Fooo", Bar= "Bar"});
    

    它不适用于元组,因为:

    public void M() {
        var t = (Foo:"fooo",Bar:"Baar");
    }
    

    在 IL 中被替换为:

    .method public hidebysig 
        instance void M () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 19 (0x13)
        .maxstack 3
        .locals init (
            [0] valuetype [mscorlib]System.ValueTuple`2<string, string>
        )
    
        IL_0000: nop
        IL_0001: ldloca.s 0
        IL_0003: ldstr "fooo"
        IL_0008: ldstr "Baar"
        IL_000d: call instance void valuetype [mscorlib]System.ValueTuple`2<string, string>::.ctor(!0, !1)
        IL_0012: ret
    } // end of method C::M
    

    如您所见,字段名称已从 IL 中消失,无法以任何方式检索(它只是语法糖)

    【讨论】:

    • 好主意,它会产生所需的 JSON,虽然它不适合我的问题。但由于我没有明确声明我需要保留元组,如果没有其他解决方案出现,我会接受这个:)
    • 我更新了我的答案,详细说明了为什么我认为使用元组不会得到更好的结果
    • 很好,忘了命名元组只是糖:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多