【问题标题】:Parse one field from nested Json to String Value将嵌套 Json 中的一个字段解析为字符串值
【发布时间】:2017-04-02 08:43:21
【问题描述】:

我的 API 响应中有一个嵌套的 JSON 字段:

"ratingBest": 10,
"reviewCount": 1,
"coordinate": {
    "latitude": "-7.2768",
    "longitude": "112.7927"
},
...

我使用 ORMLite 将上述数据保存到 Android 本地数据库,但我只想将一个字段 coordinate 设为 String。导致 Gson 自动转换为特定类型。

我已经尝试使用类字段类型作为字符串。但是还是不行

有什么解决方法吗?

谢谢

【问题讨论】:

  • 您打算如何解决这个问题?你在哪里用 Gson 保存模型?
  • 尚未实施。但是对于正常响应,我在 Android 中使用 ORMLite 助手,只需调用 create() 方法,并将来自 API 的 Json 响应作为参数。我希望将一个字段 coordinate 保存为 String 因为 Gson 会自动将每个响应转换为特定类型。

标签: android json sqlite gson


【解决方案1】:

我假设您不会以任何方式处理纬度/经度对,因为您没有提及它,并且您的“行”应该是这样的:

final class Location {

    final int ratingBest = Integer.valueOf(0);

    final int reviewCount = Integer.valueOf(0);

    @JsonAdapter(PackedCoordinateTypeAdapter.class)
    final String coordinate = null;

}

查看将特定类型适配器绑定到字段的@JsonAdapter 注释。类型适配器可能如下所示:

final class PackedCoordinateTypeAdapter
        extends TypeAdapter<String> {

    private static final String DELIMITER = " ";
    private static final String LATITUDE = "latitude";
    private static final String LONGITUDE = "longitude";

    private static final Pattern delimiterPattern = compile(DELIMITER);

    // Keep private stuff private as much possible, Gson can access it  
    private PackedCoordinateTypeAdapter() {
    }

    @Override
    @SuppressWarnings("resource")
    public void write(final JsonWriter out, final String packedLatitudeLongitude)
            throws IOException {
        final String[] split = decode(packedLatitudeLongitude);
        out.beginObject();
        out.name(LATITUDE);
        out.value(split[0]);
        out.name(LONGITUDE);
        out.value(split[1]);
        out.endObject();
    }

    @Override
    public String read(final JsonReader in)
            throws IOException {
        String latitude = null;
        String longitude = null;
        in.beginObject();
        while ( in.hasNext() ) {
            final String name = in.nextName();
            switch ( name ) {
            case LATITUDE:
                latitude = in.nextString();
                break;
            case LONGITUDE:
                longitude = in.nextString();
                break;
            default:
                throw new MalformedJsonException("Unexpected: " + name);
            }
        }
        in.endObject();
        return encode(latitude, longitude);
    }

    private static String encode(final String latitude, final String longitude)
            throws MalformedJsonException {
        if ( latitude == null ) {
            throw new MalformedJsonException("latitude not set");
        }
        if ( longitude == null ) {
            throw new MalformedJsonException("longitude not set");
        }
        return latitude + DELIMITER + longitude;
    }

    private static String[] decode(final String packedLatitudeLongitude)
            throws IllegalArgumentException {
        final String[] split = delimiterPattern.split(packedLatitudeLongitude);
        if ( split.length != 2 ) {
            throw new IllegalArgumentException("Cannot parse: " + packedLatitudeLongitude);
        }
        return split;
    }

}

演示:

final Location response = gson.fromJson("{\"ratingBest\":10,\"reviewCount\":1,\"coordinate\":{\"latitude\":\"-7.2768\",\"longitude\":\"112.7927\"}}", Location.class);
System.out.println(response.coordinate);
System.out.println(gson.toJson(response));

输出:

-7.2768 112.7927
{"ratingBest":10,"reviewCount":1,"coordinate":{"latitude":"-7.2768","longitude":"112.7927"}}

【讨论】:

    【解决方案2】:

    试试这个。

    var a = {
      "ratingBest": 10,
      "reviewCount": 1,
      "coordinate": {
        "latitude": "-7.2768",
        "longitude": "112.7927"
     }
    }
    
    var b = {
      "ratingBest": 10,
      "reviewCount": 1,
      "coordinate": JSON.stringify(a.coordinate)
    }
    

    现在存储 b

    【讨论】:

    • 哈哈,我问的是Android 中的 Json,而不是 Javascript。在 Android 中,我使用 ORMLite 使用 create() 方法自动存储来自 API 的响应。我还没有找到除了一个字段要保存为String。我希望你明白我的意思。谢谢
    【解决方案3】:

    您可以通过以下方式执行此操作:

    myObj = {
        "ratingBest": 10,
        "reviewCount": 1,
         "coordinate": {
         "latitude": "-7.2768",
         "longitude": "112.7927"
           }
        }
    var latitudex = myObj.coordinate.latitude;
    var longitudex = myObj.coordinate.longitude;
    

    希望对你有所帮助。

    【讨论】:

    猜你喜欢
    • 2016-02-21
    • 2019-11-04
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多