-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
132 lines (117 loc) · 4.29 KB
/
Program.cs
File metadata and controls
132 lines (117 loc) · 4.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Text.Encodings.Web;
class Program
{
static void Main(string[] args)
{
// Step 1: Load the JSON data
string questionsJson = File.ReadAllText("questions.json");
string answersJson = File.ReadAllText("answers.json");
var questionsData = JsonNode.Parse(questionsJson);
var answersData = JsonSerializer.Deserialize<JsonElement>(answersJson);
// Step 2: Extract all fields with values into a dictionary
var extractedAnswers = ExtractFields(answersData);
// Step 3: Merge questions with answers
MergeAnswers(questionsData, extractedAnswers);
// Step 4: Output the result to a new JSON file
string outputFilename = "output/file.json";
var options = new JsonSerializerOptions
{
WriteIndented = true,
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};
string outputJson = JsonSerializer.Serialize(questionsData, options);
File.WriteAllText(outputFilename, outputJson);
Console.WriteLine($"Processed data written to {outputFilename}");
}
static Dictionary<string, JsonElement> ExtractFields(JsonElement data)
{
var extractedFields = new Dictionary<string, JsonElement>();
void ExtractRecursive(JsonElement element)
{
if (element.ValueKind == JsonValueKind.Object)
{
foreach (var property in element.EnumerateObject())
{
if (property.Value.ValueKind == JsonValueKind.Object || property.Value.ValueKind == JsonValueKind.Array)
{
ExtractRecursive(property.Value);
}
else
{
extractedFields[property.Name] = property.Value;
}
}
}
else if (element.ValueKind == JsonValueKind.Array)
{
foreach (var item in element.EnumerateArray())
{
ExtractRecursive(item);
}
}
}
ExtractRecursive(data);
return extractedFields;
}
static void MergeAnswers(JsonNode questions, Dictionary<string, JsonElement> answers)
{
ProcessNode(questions, answers);
}
static void ProcessNode(JsonNode node, Dictionary<string, JsonElement> answers)
{
if (node is JsonObject obj)
{
if (obj["fields"] is JsonArray fields)
{
ProcessFields(fields, answers);
}
if (obj["repeatingFields"] is JsonArray repeatingFields)
{
foreach (var repeatingField in repeatingFields.AsArray())
{
ProcessNode(repeatingField, answers);
}
}
foreach (var property in obj)
{
if (property.Value is JsonObject || property.Value is JsonArray)
{
ProcessNode(property.Value, answers);
}
}
}
else if (node is JsonArray arr)
{
foreach (var item in arr)
{
ProcessNode(item, answers);
}
}
}
static void ProcessFields(JsonArray fields, Dictionary<string, JsonElement> answers)
{
foreach (var field in fields)
{
if (field is JsonObject fieldObj)
{
if (fieldObj["id"] is JsonValue idValue)
{
string? fieldId = idValue.GetValue<string>();
if (fieldId != null && answers.TryGetValue(fieldId, out JsonElement answer))
{
fieldObj["answer"] = JsonValue.Create(answer.GetString());
}
}
if (fieldObj["repeatingFields"] is JsonArray repeatingFields)
{
ProcessFields(repeatingFields, answers);
}
}
}
}
}