JSON is just a text file. You can open it with any text editor, though notepad++ on Windows does syntax highlighting.
Here’s the JSON for the first two topics in the Old Guard Rep’s talk file:
{
"id": "TALK_OLD_GUARD_REP",
"type": "talk_topic",
"dynamic_line": { "u_has_any_trait": [ "PROF_FED" ], "yes": "Marshal...", "no": "Citizen..." },
"responses": [
{ "text": "Who are you?", "topic": "TALK_OLD_GUARD_REP_NEW" },
{ "text": "Heard anything about the outside world?", "topic": "TALK_OLD_GUARD_REP_WORLD" },
{ "text": "Is there any way I can join the 'Old Guard'?", "topic": "TALK_OLD_GUARD_REP_ASK_JOIN" },
{ "text": "Does the Old Guard need anything?", "topic": "TALK_MISSION_LIST" },
{ "text": "Well, bye.", "topic": "TALK_DONE" }
],
"//": "TODO: The rep should know whether you're actually a sworn officer: Wearing the badge without the trait => Bad idea"
},
{
"id": "TALK_OLD_GUARD_REP_NEW",
"type": "talk_topic",
"dynamic_line": "I'm the region's federal liaison. Most people here call us the 'Old Guard' and I rather like the sound of it. Despite how things currently appear, the federal government was not entirely destroyed. After the outbreak I was chosen to coordinate civilian and militia efforts in support of military operations.",
"responses": [
{ "text": "So what are you actually doing here?", "topic": "TALK_OLD_GUARD_REP_NEW_DOING" },
{ "text": "Never mind...", "topic": "TALK_OLD_GUARD_REP" }
]
},
Each block between braces is a talk_topic. The NPC says the dynamic_line, and then the player can choose one of the responses. The player says the response’s text, and then the dialogue advances to the response’s topic.
It’s not super easy, but’s not very complicated either. And it’s fairly well documented in doc/NPCs.md.