While your approach to do this in JSON is cool, I think you have overlooked the 'direct' solution to do this in a RDBMS - with a linked list. Here is a quick suggestion (works in Postgres):
create table l (
id char primary key references l(prev) deferrable initially deferred,
prev char unique not null references l(id) deferrable initially deferred,
mydata text not null
);
then I populate the table with your example items:
insert into l (id, prev, mydata) values ('A', 'F', 'dA'),
('B', 'A', 'dB'),
('C', 'B', 'dC'),
('D', 'C', 'dD'),
('E', 'D', 'dE'),
('F', 'E', 'dF');
let's see how that looks like:
test=# select * from l;
select * from l;
id | prev | mydata
----+------+--------
A | F | dA
B | A | dB
C | B | dC
D | C | dD
E | D | dE
F | E | dF
(6 rows)
to insert a new item into the list, you would do:
begin;
update l set prev='G' where prev='C';
insert into l (id, prev, mydata) values ('G', 'C', 'data for G');
commit;
so that's one update, one insert for an insertion into the list. Note that the two commands have to be in one transaction, because inside the transaction the foreign key constraint is violated (as allowed by the deferrable initially deferred modifier).
Let's inspect our list again:
test=# select * from l;
select * from l;
id | prev | mydata
----+------+------------
A | F | dA
B | A | dB
C | B | dC
E | D | dE
F | E | dF
D | G | dD
G | C | data for G
so the predecessor of G is C, and the predecessor of D is G, like specified.
Of course, you loose the ability to sort with 'order by', but that's no big deal: you know the predecessor and successor of each item, so it's easy to traverse the list in either order. This could be done on the client side [probably the best solution in your case], in the application code, or inside the database with a stored procedure or with a recursive query (coming in PostgreSQL 8.4), in Oracle it could probably be done with 'connect by'.
In reality, you would of course choose other datatypes for id and prev (probably integer), but I wanted to translate your example as literally as possible. Another problem that's easily solved: how do I get all elements of one list? Solution: Either give me one 'starting element' and the list is traversed and returned. Or introduce a listId attribute and select by that, which is probably faster but without sort order.