生成带有索引项表示的集合的JSON

时间:2018-10-18 13:33:59

标签: java json gson fasterxml

是否存在一些可以生成JSON对象的库,其中集合表示为一组编号项目?

例如使用GSON库并具有这样的类时:

from neomodel import db, StructuredNode, StringProperty
from neomodel import config

config.DATABASE_URL = 'bolt://neo4j:neo4j@localhost:7687'

# Using `*args`: The first parameter to the constructor defines the `test`

class Item(StructuredNode):
    uid = StringProperty(unique_index=True)
    name = StringProperty(unique_index=True)
    def __init__(self, *args, **kwargs):       
        if args:
            test = args[0]
            kwargs['uid'] = 'g.' + str(test)
            kwargs['name'] = test
            super(Item, self).__init__(**kwargs)
        else:
            print('no test')


item = Item('test_test_test')
item.save()

# or using `**kwargs`: a entry `test` in kwargs defines the `test` for uid and name

class Kitem(StructuredNode):
    uid = StringProperty(unique_index=True)
    name = StringProperty(unique_index=True)

    def __init__(self, *args, **kwargs):       
        if kwargs and 'test' in kwargs: 
            test = kwargs['test']
            kwargs.pop('test',None)
            kwargs['uid'] = 'g.' + str(test)
            kwargs['name'] = test
            super(Kitem, self).__init__(**kwargs)
        else:
            print('no test')


kitem = Kitem(test='test_test_test_k')
kitem.save()

GSON这样生成JSON:

`class Bus {
    List<Pasenger> passengers;

    public Bus(List<Pasenger> passengers) {
        this.passengers = passengers;
    }
}`

但是我被要求生成一个JSON,其中用每个具有索引的项目表示集合。 像这样:

`{"bus":{
    "passengers":[
    {"name":"John","familiName":"Smith"},
    {"name":"Marry","familiName":"James"}
    ]
}}`

我研究了GSON和FasterXML,但找不到对此功能的支持。 有人知道有图书馆支持吗?

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

您可以创建一个实现JsonSerializer的类,以指定序列化的方式。
然后在构建您的Gson时注册它:     Gson gson = new GsonBuilder()。registerTypeAdapter(Bus.class,new BusAdapter())。create();

更多信息:https://github.com/google/gson/blob/master/UserGuide.md#TOC-Writing-a-Serializer

答案 1 :(得分:1)

我认为您可以创建Map而不是List(如果您不想编写自定义序列化程序和反序列化程序)。而Bus的构造函数将像这样:

private Map<String, Pasenger> bus = new HashMap<>();

public Bus(List<Pasenger> passengers) {
      for (int i = 0; i < passengers.size(); i++){
           bus.put("passengers["+i+"]", passengers.get(i));
      }
}

对于简单的Pasenger,仅使用名称

{"bus":
    {
      "passengers[0]":{"name":"first"},
      "passengers[1]":{"name":"second"}
    }
}