[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [local‑first/Query](https://evolu.dev/docs/api-reference/common/local-first/Query) › evoluJsonObjectFrom

```ts
function evoluJsonObjectFrom<O>(
  expr: SelectQueryBuilderExpression<O>,
): RawBuilder<Simplify<O> | null>;
```

Defined in: [packages/common/src/local-first/Query.ts:224](https://github.com/evoluhq/evolu/blob/49ea8ca499566aba270f8cb601e7f49aa62320f8/packages/common/src/local-first/Query.ts#L224)

An improved Evolu version of Kysely's SQLite `jsonObjectFrom` helper.

Kysely's `ParseJSONResultsPlugin` heuristically parses any result string that
looks like JSON. Evolu instead prefixes JSON produced by these helpers with a
per-runtime identifier and only parses values carrying that prefix, avoiding
accidental parsing of ordinary string columns that merely happen to start
with `{` or `[`.

The subquery must only return one row.

### Example

```ts
import {
  createQueryBuilder,
  evoluJsonObjectFrom,
  id,
  NonEmptyTrimmedString100,
  SqliteBoolean,
} from "@evolu/common";

const PersonId = id("Person");
const Schema = {
  person: { id: PersonId },
  pet: {
    id: id("Pet"),
    name: NonEmptyTrimmedString100,
    personId: PersonId,
    isFavorite: SqliteBoolean,
  },
};
const createQuery = createQueryBuilder(Schema);
const people = createQuery((db) =>
  db
    .selectFrom("person")
    .select(["person.id"])
    .select((eb) => [
      evoluJsonObjectFrom(
        eb
          .selectFrom("pet")
          .select(["pet.id as petId", "pet.name"])
          .whereRef("pet.personId", "=", "person.id")
          .where("pet.isFavorite", "=", 1),
      ).as("favoritePet"),
    ]),
);

expectTypeOf<typeof people.Row.favoritePet>().toEqualTypeOf<{
  petId: typeof Schema.pet.id.Output;
  name: NonEmptyTrimmedString100 | null;
} | null>();
```