Using String Templates with JSON in JavaScript: Any Solutions?

I just found out about string templates in JavaScript ES6. They’re so cool! But I’m stuck on how to use them with JSON.

Here’s my problem: I load files with XHR and use JSON.parse(). But it doesn’t like the backticks used in string templates. Is there a way to save string templates directly in JSON files?

What I want to do is use these for dynamic strings and translations. I’m tired of messy code like:

"Hello " + username + "! How are you?"

I’d rather have something clean like:

`Hello, ${username}! How are you?`

where username is a variable. Can this be done? I’m okay with using a function to change strings into templates, as long as it’s not slow. But I want to avoid using eval if possible.

Any ideas on how to make this work? Thanks!

I’ve encountered this issue before in a project. While JSON doesn’t directly support template literals, there’s a workaround you might find useful. Consider storing your templates as regular strings in JSON, then process them with a custom function when you need to interpolate variables. Here’s a basic approach:

  1. Store templates in JSON as normal strings:
    {“greeting”: “Hello, {username}! How are you?”}

  2. Create a simple interpolation function:
    function interpolate(template, values) {
    return template.replace(/{(\w+)}/g, (_, k) => values[k]);
    }

  3. Use it like this:
    let template = JSON.parse(jsonData).greeting;
    let result = interpolate(template, { username: ‘John’ });

This method maintains JSON compatibility while allowing for dynamic string creation. It’s efficient and avoids eval(). Hope this helps!

I feel your pain, OwenNebula55. JSON and template literals don’t play nice out of the box, but there’s a neat trick I’ve used that might help you out.

Instead of trying to store actual template literals in JSON, you can use a custom placeholder syntax. Something like this:

{
  "greeting": "Hello, {{username}}! How are you?"
}

Then, when you parse the JSON, you can use a simple regex to replace the placeholders with the actual values. Here’s a quick function I whipped up:

function parseTemplate(template, data) {
  return template.replace(/\{\{(\w+)\}\}/g, (_, key) => data[key] || '');
}

This approach keeps your JSON valid and your code clean. It’s also pretty fast since it’s just doing a simple string replacement. Give it a shot and see if it works for your use case!

hey man, i get ur struggle! string templates r awesome but can be tricky w/ JSON. have u tried using a custom parser? u could write a func that replaces ${var} with actual values before parsing. might be a bit slower but way cleaner than concatenation. just an idea, hope it helps!