Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json typescript中的自定义序列化未按预期进行(数组正在转换为具有排列的对象) 1.问题_Json_Typescript_Serialization - Fatal编程技术网

Json typescript中的自定义序列化未按预期进行(数组正在转换为具有排列的对象) 1.问题

Json typescript中的自定义序列化未按预期进行(数组正在转换为具有排列的对象) 1.问题,json,typescript,serialization,Json,Typescript,Serialization,我正在用TypeScript进行自定义序列化,如下例所示 我正在将所有字符串序列化为自定义类型。使用以下方法,所有字符串都会被很好地替换,但是数组中的将作为对象返回。我们的期望是数组应该作为数组保留在返回的新对象中,对于对象和数组中都存在的字符串,它应该可以正常工作 作为额外信息,我正在序列化项目中字符串以外的自定义类型,这是我正在尝试做的一个示例 有什么意见吗 2.代码 第一个json显示传入的对象 第二个json显示返回的对象:我们可以看到z正在转换为一个对象 预期产出 { "x

我正在用TypeScript进行自定义序列化,如下例所示

我正在将所有字符串序列化为自定义类型。使用以下方法,所有字符串都会被很好地替换,但是数组中的将作为对象返回。我们的期望是数组应该作为数组保留在返回的新对象中,对于对象和数组中都存在的字符串,它应该可以正常工作

作为额外信息,我正在序列化项目中字符串以外的自定义类型,这是我正在尝试做的一个示例

有什么意见吗

2.代码
  • 第一个
    json
    显示传入的对象
  • 第二个
    json
    显示返回的对象:我们可以看到
    z
    正在转换为一个对象
预期产出

{
    "x": 1,
    "y": "hello",
    "z": [{"a": 10, "b": ["hello", "hi"]}]
}

{
    "x": 1,
    "y": {"_type": "test", "_value": "hello"},
    "z": [{"a": 10, "b": [{"_type": "test", "_value": "hello"}, {"_type": "test", "_value": "hi"}]}]
}

对您的任务的直接回答如下:

const sample: Record<string, any> = {
    x: 1,
    y: 'hello',
    z: [{ a: 10, b: ['hello', 'hi'] }]
};

function replacer(key, value) {
    if (['_type', '_value'].includes(key)) {
        return value;
    }

    if (typeof value === 'string') {
        return {
            _type: 'test',
            _value: value,
        };
    }

    return value;
}

console.log(JSON.stringify(sample, replacer, 2));
但我的直觉告诉我,你正在试图发明轮子,所以我建议你去看看它能帮你操纵普通对象到类和回类


注意:如果您使用的是typescript,请尽量不要使用
any

我看不出您在哪里使用IsArray。我想添加一些功能来区分对象和数组,但不确定如何使用。对此很抱歉,现在它什么也没做。那么就从帖子的代码中去掉它吧,这样对于那些想要帮助的人来说就更容易阅读了。任何不必要的事情都会损害你获得帮助的能力。当然,你得把它拿出来。感谢问题是这个对象。条目(['a',b'])将返回[[“0”,“a”],[“1”,“b”]],这就是为什么在您进行操作后,您得到的是该对象而不是ArrayTanks@D.Dimitrioglo,它解决了问题。我将努力学习班上的特朗斯弗默。谢谢
{
    "x": 1,
    "y": "hello",
    "z": [{"a": 10, "b": ["hello", "hi"]}]
}

{
    "x": 1,
    "y": {"_type": "test", "_value": "hello"},
    "z": [{"a": 10, "b": [{"_type": "test", "_value": "hello"}, {"_type": "test", "_value": "hi"}]}]
}
const sample: Record<string, any> = {
    x: 1,
    y: 'hello',
    z: [{ a: 10, b: ['hello', 'hi'] }]
};

function replacer(key, value) {
    if (['_type', '_value'].includes(key)) {
        return value;
    }

    if (typeof value === 'string') {
        return {
            _type: 'test',
            _value: value,
        };
    }

    return value;
}

console.log(JSON.stringify(sample, replacer, 2));
{
  "x": 1,
  "y": {
    "_type": "test",
    "_value": "hello"
  },
  "z": [
    {
      "a": 10,
      "b": [
        {
          "_type": "test",
          "_value": "hello"
        },
        {
          "_type": "test",
          "_value": "hi"
        }
      ]
    }
  ]
}