Json-Import of nodes with taxonomy terms
Not knowing how the rest of your dependencies are set up, one thing I notice off the bat is that your keywords source field is a comma-separated single string, but you're treating it as an array of values in your processor. Maybe something like this:

protected function createBlog(string $json)
{
    $jsonout = json_decode($json, TRUE);

    foreach ($jsonout as $blog) {
        $newTags = explode(', ', $blog['keywords']);
        $newTagIDs = [];
        foreach ($newTags as $tag) {
            $newTagIDs[] = Term::create(array(
                'name' =&gt; $tag,
                'vid' =&gt; 'tags'
            ))-&gt;save();
        }

        $node = Node::create(array(
            'type' =&gt; 'blog',
            'langcode' =&gt; 'de',
            'uid' =&gt; '1',
            'status' =&gt; 1,
            'title' =&gt; $blog['title'],
            'field_tags' =&gt; $newTagIDs,
            'body' =&gt; ['value' =&gt; $blog['bodytext'], 'format' =&gt; 'full_html']
        ));

        $node-&gt;save();
    }
}


You're right that your approach would create multiple copies of the same term, though. The Entity Lookup plugin from the migrate_plus module might provide some help:

// $this-&gt;entityManager is a dependency-injected instance of Drupal\Core\Entity\EntityManagerInterface
$query = $this-&gt;entityManager-&gt;getStorage('taxonomy_term')
    -&gt;getQuery()
    -&gt;condition('name', $termNameToLookup)
    -&gt;condition('vid', $vocabularyToLookup);
$results = $query-&gt;execute();
if (empty($results)) {
    // term doesn't exist in that vocabulary; should add it
} else {
    // the term already exists in that vocabulary; do something with it
}