diff --git a/data-manager-samples/src/main/java/com/google/ads/datamanager/samples/IngestAudienceMembers.java b/data-manager-samples/src/main/java/com/google/ads/datamanager/samples/IngestAudienceMembers.java
index 58e8fec..b0ee2a3 100644
--- a/data-manager-samples/src/main/java/com/google/ads/datamanager/samples/IngestAudienceMembers.java
+++ b/data-manager-samples/src/main/java/com/google/ads/datamanager/samples/IngestAudienceMembers.java
@@ -36,9 +36,14 @@
import com.google.ads.datamanager.v1.UserData;
import com.google.ads.datamanager.v1.UserIdentifier;
import com.google.common.collect.Lists;
+import com.google.common.reflect.TypeToken;
+import com.google.gson.GsonBuilder;
import java.io.BufferedReader;
-import java.io.FileReader;
import java.io.IOException;
+import java.lang.reflect.Type;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.List;
@@ -48,7 +53,7 @@
/**
* Sends an {@link IngestAudienceMembersRequest} with the option to use encryption.
*
- *
User data is read from a data file. See the {@code audience_members_1.csv} file in the {@code
+ *
User data is read from a data file. See the {@code audience_members_1.json} file in the {@code
* resources/sampledata} directory for a sample file.
*/
public class IngestAudienceMembers {
@@ -99,10 +104,10 @@ private static final class ParamsConfig extends BaseParamsConfig {
String audienceId;
@Parameter(
- names = "--csvFile",
+ names = "--jsonFile",
required = true,
- description = "Comma-separated file containing user data to ingest")
- String csvFile;
+ description = "JSON file containing user data to ingest")
+ String jsonFile;
@Parameter(
names = "--keyUri",
@@ -154,7 +159,7 @@ public static void main(String[] args) throws IOException, GeneralSecurityExcept
*/
private void runExample(ParamsConfig params) throws IOException, GeneralSecurityException {
// Reads member data from the data file.
- List memberList = readMemberDataFile(params.csvFile);
+ List memberList = readMemberData(params.jsonFile);
// Gets an instance of the UserDataFormatter for normalizing and formatting the data.
UserDataFormatter userDataFormatter = UserDataFormatter.create();
@@ -172,7 +177,7 @@ private void runExample(ParamsConfig params) throws IOException, GeneralSecurity
UserData.Builder userDataBuilder = UserData.newBuilder();
// Adds a UserIdentifier for each valid email address for the member.
- for (String email : member.emailAddresses) {
+ for (String email : member.emails) {
String processedEmail;
try {
processedEmail =
@@ -200,7 +205,8 @@ private void runExample(ParamsConfig params) throws IOException, GeneralSecurity
// Skips invalid input.
continue;
}
- // Sets the phone number identifier to the encoded and possibly encrypted phone number hash.
+ // Sets the phone number identifier to the encoded and possibly encrypted phone number
+ // hash.
userDataBuilder.addUserIdentifiers(
UserIdentifier.newBuilder().setPhoneNumber(processedPhoneNumber));
}
@@ -278,9 +284,17 @@ private void runExample(ParamsConfig params) throws IOException, GeneralSecurity
requestBuilder.setEncryptionInfo(encryptionInfo);
}
+ // Builds and logs the request.
IngestAudienceMembersRequest request = requestBuilder.build();
+ if (LOGGER.isLoggable(Level.INFO)) {
+ LOGGER.info(String.format("Request #%d:%n%s", requestCount, request));
+ }
+
+ // Sends the request.
IngestAudienceMembersResponse response =
ingestionServiceClient.ingestAudienceMembers(request);
+
+ // Logs the response.
if (LOGGER.isLoggable(Level.INFO)) {
LOGGER.info(String.format("Response for request #%d:%n%s", requestCount, response));
}
@@ -290,60 +304,26 @@ private void runExample(ParamsConfig params) throws IOException, GeneralSecurity
}
/** Data object for a single row of input data. */
+ @SuppressWarnings("unused")
private static class Member {
- private final List emailAddresses = new ArrayList<>();
- private final List phoneNumbers = new ArrayList<>();
+ private List emails = new ArrayList<>();
+ private List phoneNumbers = new ArrayList<>();
}
/**
- * Reads the data file and parses each line into a {@link IngestAudienceMembers.Member} object.
+ * Reads the data file and parses it into a list of {@link IngestAudienceMembers.Member} objects.
*
- * @param dataFile the CSV data file
+ * @param jsonFile the JSON data file
* @return a list of Member objects
*/
- private List readMemberDataFile(String dataFile) throws IOException {
- List members = new ArrayList<>();
- try (BufferedReader reader = new BufferedReader(new FileReader(dataFile))) {
- String line;
- int lineNumber = 0;
- while ((line = reader.readLine()) != null) {
- lineNumber++;
- if (line.startsWith("#")) {
- // Skips comment lines.
- continue;
- }
- // Expected format:
- // email_1,email_2,email_3,phone_1,phone_2,phone_3
- String[] columns = line.split(",");
- if (columns[0].equals("email_1")) {
- // Skips header row.
- continue;
- }
- Member member = new Member();
- for (int col = 0; col < columns.length; col++) {
- if (columns[col] == null || columns[col].trim().isEmpty()) {
- // Skips blank value for the row and column.
- continue;
- }
- // Parses the row, ignoring anything beyond column index 5.
- if (col < 3) {
- member.emailAddresses.add(columns[col]);
- } else if (col < 6) {
- member.phoneNumbers.add(columns[col]);
- } else {
- LOGGER.warning("Ignoring column index " + col + " in line #" + lineNumber);
- }
- }
- if (member.emailAddresses.isEmpty() && member.phoneNumbers.isEmpty()) {
- // Skips the row since it contains no user data.
- LOGGER.warning(String.format("Ignoring line %d. No data.", lineNumber));
- } else {
- // Adds the parsed user data to the list.
- members.add(member);
- }
- }
- }
+ private List readMemberData(String jsonFile) throws IOException {
+ try (BufferedReader jsonReader =
+ Files.newBufferedReader(Paths.get(jsonFile), StandardCharsets.UTF_8)) {
+ // Define the type for Gson to deserialize into (List of Member objects)
+ Type recordListType = new TypeToken>() {}.getType();
- return members;
+ // Parse the JSON string from the file into a List of Member objects
+ return new GsonBuilder().create().fromJson(jsonReader, recordListType);
+ }
}
}
diff --git a/data-manager-samples/src/main/resources/sampledata/audience_members_1.csv b/data-manager-samples/src/main/resources/sampledata/audience_members_1.csv
deleted file mode 100644
index bdb6b60..0000000
--- a/data-manager-samples/src/main/resources/sampledata/audience_members_1.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-email_1,email_2,email_3,phone_1,phone_2,phone_3
-dana@example.com,DanaM@example.com,,,,
-ALEXF@example.com, AlexF@cymbalgroup.com,alexF@altostrat.com,+1-800‑555‑0100,+1 800‑555‑0101,+1 800‑555‑0102
-quinn@CYMBALGROUP.com, baklavainthebalkans@gmail.com ,,,,
-rosario@example.org,cloudySanFrancisco@GMAIL.com,,+1-800‑555‑0110,,
diff --git a/data-manager-samples/src/main/resources/sampledata/audience_members_1.json b/data-manager-samples/src/main/resources/sampledata/audience_members_1.json
new file mode 100644
index 0000000..f40064d
--- /dev/null
+++ b/data-manager-samples/src/main/resources/sampledata/audience_members_1.json
@@ -0,0 +1,35 @@
+[
+ {
+ "emails": [
+ "dana@example.com",
+ "DanaM@example.com"
+ ]
+ },
+ {
+ "emails": [
+ "ALEXF@example.com",
+ "AlexF@cymbalgroup.com",
+ "alexF@altostrat.com"
+ ],
+ "phoneNumbers": [
+ "+1-800-555-0100",
+ "+1 800-555-0101",
+ "+1 800-555-0102"
+ ]
+ },
+ {
+ "emails": [
+ "quinn@CYMBALGROUP.com",
+ "baklavainthebalkans@gmail.com"
+ ]
+ },
+ {
+ "emails": [
+ "rosario@example.org",
+ "cloudySanFrancisco@GMAIL.com"
+ ],
+ "phoneNumbers": [
+ "+1-800-555-0110"
+ ]
+ }
+]