From 14ee4b6426e6540e204a3cbcfb5a6c9dd952b65c Mon Sep 17 00:00:00 2001 From: Josh Radcliff Date: Wed, 10 Jun 2026 17:28:58 -0400 Subject: [PATCH] feat(sample): use JSON input for audience sample Change-Id: I56436632eca41bc2e7b710b1c59b9ccc92476bfe --- .../samples/IngestAudienceMembers.java | 90 ++++++++----------- .../sampledata/audience_members_1.csv | 5 -- .../sampledata/audience_members_1.json | 35 ++++++++ 3 files changed, 70 insertions(+), 60 deletions(-) delete mode 100644 data-manager-samples/src/main/resources/sampledata/audience_members_1.csv create mode 100644 data-manager-samples/src/main/resources/sampledata/audience_members_1.json 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" + ] + } +]