替换JSON中文本的最佳方法是什么?

时间:2018-10-14 11:17:32

标签: javascript json

因此,我有一堆JSON数据,它包含一些字段。例如:

[{
    "id": "XXX",
    "version": 1,
    "head": {
        "text": "Main title",
        "sub": {
            "value": "next"
        },
        "place": "secondary"
    },
    "body": [{
            "id": "XXX1",
            "info": "three little birds",
            "extended": {
                "spl": {
                    "text": "song",
                    "type": {
                        "value": "a"
                    }
                }
            }
        },
        {
            "id": "XXX2",
            "info": [
                "how are you?"
            ],
            "extended": {
                "spl": {
                    "text": "just",
                    "non-type": {
                        "value": "abc"
                    }
                }
            }
        }
    ]
}]
  1. 我要尝试的是某种转换表(来自其他JSON文件) 如果字段的值为“ a”,请替换为“其他文本..”等。

  2. 我为JSON管道提供服务,所以我想这是进行替换的正确位置。

因此,在此示例中,我具有上面的JSON,并且在转换表中,我具有以下术语:

下一个:前进, 歌曲:音乐, 答:option1, 只是:来自 等等...

2 个答案:

答案 0 :(得分:0)

最好的方法是解析它,替换对象中的文本,然后对其进行字符串化。

下一个最佳方法是使用正则表达式。

在此示例中,如果无法为路径建立索引,我会捕获异常,并使用['type']而不是.type,以便根据需要扩展为索引'non-type'

const data = `[{
    "id": "XXX",
    "version": 1,
    "head": {
        "text": "Main title",
        "sub": {
            "value": "next"
        },
        "place": "secondary"
    },
    "body": [{
            "id": "XXX1",
            "info": "three little birds",
            "extended": {
                "spl": {
                    "text": "song",
                    "type": {
                        "value": "a"
                    }
                }
            }
        },
        {
            "id": "XXX2",
            "info": [
                "how are you?"
            ],
            "extended": {
                "spl": {
                    "text": "just",
                    "non-type": {
                        "value": "abc"
                    }
                }
            }
        }
    ]
}]
`

const o = JSON.parse(data)
o[0].body.forEach(b => {
  try {
    if (b.extended.spl['type'].value === 'a') {
      b.extended.spl['type'].value = 'CHANGED'
    }
  } catch (e) {}
})

const newData = JSON.stringify(o, null, 2)
console.log(newData)

如果您知道并且可以依赖于源代码符合性,那么字符串替换方法将起作用,例如,唯一的"value"位于"type"

const data = `[{
    "id": "XXX",
    "version": 1,
    "head": {
        "text": "Main title",
        "sub": {
            "value": "next"
        },
        "place": "secondary"
    },
    "body": [{
            "id": "XXX1",
            "info": "three little birds",
            "extended": {
                "spl": {
                    "text": "song",
                    "type": {
                        "value": "a"
                    }
                }
            }
        },
        {
            "id": "XXX2",
            "info": [
                "how are you?"
            ],
            "extended": {
                "spl": {
                    "text": "just",
                    "non-type": {
                        "value": "abc"
                    }
                }
            }
        }
    ]
}]
`

const newData = data.replace(/"value": "a"/g, '"value": "NEWVALUE"')

console.log(newData)

答案 1 :(得分:0)

您要寻找的东西可以通过模板来实现。用可以从某些外部工具(例如class App : Application(), HasActivityInjector, HasSupportFragmentInjector { @Inject lateinit var activityInjector: DispatchingAndroidInjector<Activity> @Inject lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment> override fun onCreate() { super.onCreate() DaggerAppComponent .builder() .appModule(AppModule(this)) .networkModule(NetworkModule("https://jsonplaceholder.typicode.com/")) .build() .inject(this) } override fun activityInjector(): AndroidInjector<Activity> { return activityInjector } override fun supportFragmentInjector(): AndroidInjector<Fragment> { return fragmentInjector } } perl中找到并替换的某些特定标记替换变量部分。

例如,您可能有一个sed,内容如下:

template.json

然后,当您需要实际的JSON时,可以通过将这些模板替换为实际数据的中间脚本来传递它。

...
"type": {
  "value": "@@VALUE@@"
}
...

或者,使用Perl:

cat template.json | sed -e 's/@@VALUE@@/my_value/' > target.json