0

I am a newbie to DGraph. So, I was experimenting with dgraph4j samples and modified it a little.

In the example I am trying to query on following data:

{
   "all":[
      {
         "name":"Alice",
         "friend":{
            "name":"Bob"
         }
      },
      {
         "name":"Bob"
      }
   ]
}

But as soon as I ran the following program:

import com.google.gson.Gson;
import com.google.protobuf.ByteString;
import io.dgraph.DgraphClient;
import io.dgraph.DgraphClient.Transaction;
import io.dgraph.DgraphGrpc;
import io.dgraph.DgraphGrpc.DgraphBlockingStub;
import io.dgraph.DgraphProto.Mutation;
import io.dgraph.DgraphProto.Operation;
import io.dgraph.DgraphProto.Response;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

public class AppLink {
    private static final String TEST_HOSTNAME = "localhost";
    private static final int TEST_PORT = 9080;

    public static void main(final String[] args) {
        ManagedChannel channel =
                ManagedChannelBuilder.forAddress(TEST_HOSTNAME, TEST_PORT).usePlaintext(true).build();
        DgraphBlockingStub blockingStub = DgraphGrpc.newBlockingStub(channel);
        DgraphClient dgraphClient = new DgraphClient(Collections.singletonList(blockingStub));

        // Initialize
        dgraphClient.alter(Operation.newBuilder().setDropAll(true).build());

        // Set schema
        String schema = "name: string @index(exact) .";
        Operation op = Operation.newBuilder().setSchema(schema).build();
        dgraphClient.alter(op);

        Gson gson = new Gson(); // For JSON encode/decode

        Transaction txn = dgraphClient.newTransaction();
        try {
            // Create data
            Person p1 = new Person();
            p1.name = "Alice";
            Person p2 = new Person();
            p2.name = "Bob";
            p1.friend = p2;

            People ppl = new People();
            ppl.all = new ArrayList<>();
            ppl.all.add(p1);
            ppl.all.add(p2);

            // Serialize it
            String json = gson.toJson(ppl);

            // Run mutation
            Mutation mu =
                    Mutation.newBuilder().setSetJson(ByteString.copyFromUtf8(json)).build();
            txn.mutate(mu);
            txn.commit();

        } finally {
            txn.discard();
        }
        // Query
        String query =
                "query all($a: string){\n" + "all(func: eq(name, $a)) {\n" + "    name\n" + "    friend{name}\n" + "  }\n" + "}";
        Map<String, String> vars = Collections.singletonMap("$a", "Alice");
        Response res = dgraphClient.newTransaction().queryWithVars(query, vars);

        // Deserialize
        People ppl = gson.fromJson(res.getJson().toStringUtf8(), People.class);

        // Print results
        System.out.printf("people found: %d\n", ppl.all.size());
        ppl.all.forEach(person -> {
            System.out.println(person.name);
            System.out.println(person.friend);
        });
    }

    static class Person {
        String name;
        Person friend;

        Person() {}
    }

    static class People {
        List<Person> all;

        People() {}
    }
}

I got JsonSyntaxException-

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 35 path $.all[0].friend
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
        at com.google.gson.Gson$FutureTypeAdapter.read(Gson.java:969)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
        at com.google.gson.Gson.fromJson(Gson.java:887)
        at com.google.gson.Gson.fromJson(Gson.java:852)
        at com.google.gson.Gson.fromJson(Gson.java:801)
        at com.google.gson.Gson.fromJson(Gson.java:773)
        at AppLink.main(AppLink.java:74)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 35 path $.all[0].friend
        at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213)
        ... 13 more

Can anyone help me resolve it?

himanshuIIITian
  • 5,985
  • 6
  • 50
  • 70

1 Answers1

2

Looks like the problem is from res.getJson() it tries to convert Array of object to Array of people, unfortunately gson cannot create direct parsing from JSON Array to Array of Objects you need to pull "all" and you need to take it's array in order to parse and not the whole object

you need create something like that

List<People> people;    
Type listType = new TypeToken<List<People>>() {
                    }.getType();
 people= new Gson().fromJson(new JSONObject(res.getJson().toStringUtf8()).getJSON("all").toString(), listType);
Basil Battikhi
  • 2,638
  • 1
  • 18
  • 34